2016-03-27 11 views
0

のは、私はこのリストを持っているとしましょう:sedの特定の行番号の置換(スワップ)

apple 
orange 
banana 
kiwi 
strawberry 

私はライン4(kiwi)の値と2行目(orange)の値を入れ替えることができますどのようにこれを取得します:

apple 
kiwi # before "orange" 
banana 
orange # before "kiwi" 
strawberry 
このような
+0

"list"がファイル内にある場合、これは 'sed'よりも' ed'でもっと簡単です:http://compgroups.net/comp.unix.shell/using-sed-to-swap-two -lines-in-a-file/498772 –

+1

sedには1つの永久変数holdバッファのみがあります。あなたの仕事は、バナナとオレンジの貯蔵とその順序の入れ替えが必要です。 ** sed **と一時ファイルで可能ですが、** awk **や** perl **ではもっと簡単になります。 –

+0

スワップする単語がペアでしか表示されない場合は、それぞれを盲目的に変更することができます。 –

答えて

0

しかし、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に取り組むため

+0

'-v 'FS = \ n' == -F '\ n" ' – karakfa

1

$ 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に示すように、それぞれが所望の線を抽出し、現在の行を削除するedコマンドを組み合わせます。おそらく、-eに分割してコマンドを分割することはできないかもしれませんが、エスケープするのは面倒です。

0

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)あなたのために働くかもしれない

0

sed -r '2{:a;N;4!ba;s/([^\n]*)(\n?.*\n)(.*)/\3\2\1/}' file 

ライン2に集中し、(この場合はライン4で)必要なラインまでパターンスペース(PS)に行を追加します。パターンマッチングを使用して、行の順序を変更します。

N.B.これは、任意の線のペア(隣接する線であっても)を置き換えるために使用できます。

関連する問題