GNU/Linux >> Linux の 問題 >  >> Linux

3つの連続した行をスワップとマージしますか?

ねえ、「ファイル」の2行目と3行目を入れ替えて3行連続でマージする必要があります:

$cat file
Object Name: A
    comments: comment A
    manual_encdomain: Name: A 
Object Name: B
    comments: comment B
    manual_encdomain: Name: B 

したがって、以下の出力の代わりに:

$sed 'N;N;s/n/ /g' file 
Object Name: A comments: comment A manual_encdomain: Name: A 
Object Name: B comments: comment B manual_encdomain: Name: B

むしろこれが必要です

Object Name: A manual_encdomain: Name: A comments: comment A
Object Name: B manual_encdomain: Name: B comments: comment B

sed、awk何でも

承認された回答:

はい、sedを使用して行を入れ替えることができます:

$ sed -E 'N;N;s/n([^n]*)n([^n]*)/ 2 1/' file
Object Name: A     manual_encdomain: Name: A      comments: comment A
Object Name: B     manual_encdomain: Name: B      comments: comment B

または、同等に:

$ sed  'N;N;s/n([^n]*)n([^n]*)/ 2 1/g' file
Object Name: A     manual_encdomain: Name: A      comments: comment A
Object Name: B     manual_encdomain: Name: B      comments: comment B

仕組み:

  • -E

    これにより、拡張正規表現がオンになります。 (-E BSD(OSX)sedと最新のGNUsedの両方で動作します。 GNU sedの古いバージョンの場合は、-rを使用します 代わりに。)

    拡張正規表現がない場合は、(をエスケープする必要があります および) 上記のように。

  • N;N

    これは2行目と3行目を読み取ります。

  • s/n([^n]*)n([^n]*)/ 2 1/

    これにより、2行目と3行目が入れ替わります。 n([^n]*)の最初の出現 2行目をキャプチャし、キャプチャグループ1に保存します。n([^n]*)の2番目のオカレンス 3行目をキャプチャし、キャプチャグループ2に保存します。置換テキスト2 1 改行をスペースに置き換えながら位置を入れ替えます。

余分な空白を削除する

2行目と3行目は、入力ファイルでインデントされています。その余分な空白を削除したい場合:

$ sed -E 'N;N;s/n[[:blank:]]*([^n]*)n[[:blank:]]*([^n]*)/ 2 1/g' file
Object Name: A manual_encdomain: Name: A  comments: comment A
Object Name: B manual_encdomain: Name: B  comments: comment B

[[:blank:]] 空白とタブを照合するためのUnicodeで安全な方法です。


Linux
  1. フォルダをMvとマージしますか?

  2. 行の範囲を行の範囲(sedまたはその他)に置き換えますか?

  3. Mcでワードラップを使用していますか?

  1. 文字列を含む名前のすべてのファイルを検索

  2. 特定の名前のフォルダを削除する方法

  3. Linux でこの名前のファイルを削除する方法:-]???????q

  1. Softaculous で phpList をインストールする

  2. `npm install` は Killed で終わります

  3. 変な名前のファイルを削除するには?