のは、私はこのリストを持っているとしましょう:sedの特定の行番号の置換(スワップ)
apple
orange
banana
kiwi
strawberry
私はライン4(kiwi
)の値と2行目(orange
)の値を入れ替えることができますどのようにこれを取得します:
apple
kiwi # before "orange"
banana
orange # before "kiwi"
strawberry
このような
のは、私はこのリストを持っているとしましょう:sedの特定の行番号の置換(スワップ)
apple
orange
banana
kiwi
strawberry
私はライン4(kiwi
)の値と2行目(orange
)の値を入れ替えることができますどのようにこれを取得します:
apple
kiwi # before "orange"
banana
orange # before "kiwi"
strawberry
このような
しかし、GNU awkをして、あなたが(fruits.txt
であなたのリストを使用して)行うことができ、SEDでそれを行う方法を知ってはいけない:
awk -v 'FS=\n' -v 'OFS=\n' -v 'RS=' '1 {print $1, $4, $3, $2, $5}' fruits.txt
さまざまな-v ...
は、入力フィールドと出力フィールドのセパレータを改行に設定し、レコードセパレータをクリアします。溶液は、特に行2及び4に取り組むため
'-v 'FS = \ n' == -F '\ n" ' – karakfa
:
$ sed '2{N;N;s/^\(.*\)\(\n.*\n\)\(.*\)$/\3\2\1/}' infile
apple
kiwi
banana
orange
strawberry
線2に達する、これはパターンスペースに次の2行を追加し、最初と最後の行を入れ替え。
同じアプローチを使用してこれを一般化するには、N
(2番目のキャプチャグループでは\n
)の数を増やす必要があります。おそらく、sedコマンドを生成するスクリプトを書くことが最善の方法でしょう。
GNU sed特有のもう1つのオプション:e
コマンド。シェルコマンドの結果をパターンスペースにパイプすることができます。
sed -e '2{e'"sed -n '4{p;q}' infile" -e 'd}' \
-e '4{e'"sed -n '2{p;q}' infile" -e 'd}' infile
1 apple
4 kiwi
3 banana
2 orange
5 strawberry
これは、両方のライン2及び図4に示すように、それぞれが所望の線を抽出し、現在の行を削除するe
とd
コマンドを組み合わせます。おそらく、-e
に分割してコマンドを分割することはできないかもしれませんが、エスケープするのは面倒です。
awk
レスキュー!
$ awk -v first=2 -v second=4 'FNR==NR{if(NR==second)s=$0; next}
FNR==first{f=$0; $0=s}
FNR==second{$0=f} 1' fruits{,}
apple
kiwi
banana
orange
strawberry
は、ファイルをダブルスキャンすることで、変数で指定された行を1番目と2番目にスワップします。これは、(GNU SED)あなたのために働くかもしれない
:
sed -r '2{:a;N;4!ba;s/([^\n]*)(\n?.*\n)(.*)/\3\2\1/}' file
ライン2に集中し、(この場合はライン4で)必要なラインまでパターンスペース(PS)に行を追加します。パターンマッチングを使用して、行の順序を変更します。
N.B.これは、任意の線のペア(隣接する線であっても)を置き換えるために使用できます。
"list"がファイル内にある場合、これは 'sed'よりも' ed'でもっと簡単です:http://compgroups.net/comp.unix.shell/using-sed-to-swap-two -lines-in-a-file/498772 –
sedには1つの永久変数holdバッファのみがあります。あなたの仕事は、バナナとオレンジの貯蔵とその順序の入れ替えが必要です。 ** sed **と一時ファイルで可能ですが、** awk **や** perl **ではもっと簡単になります。 –
スワップする単語がペアでしか表示されない場合は、それぞれを盲目的に変更することができます。 –