sed: X 行をカットしてファイルの先頭に追加

sed: X 行をカットしてファイルの先頭に追加

X線を切り取り、y位置(上部)にX線を挿入できるようにしたいです。これにより、一部の構成ファイルを再構成するのに役立ちます。

Text example line number 1 <--- Append line 10 above line 1
Text example line number 2
Text example line number 3
Text example line number 4
Text example line number 5
Text example line number 6
Text example line number 7
Text example line number 8
Text example line number 9
Text example line number 10 <--- Cut or hold in buffer
Text example line number 11
Text example line number 12
Text example line number 13

これまで私が見つけた唯一のことは次のとおりです。

# Cuts line 10 and adds it to the end of file    
sed -n -e '10h;10!p;${g;p;}' file-01.txt

しかし、予約された内容を最後の行以外の行に入れる方法がわかりません。

残念ながら、私はsedに慣れていません。 stackoverflowとここでも同様の質問がありますが、必要に応じて修正することはできません。

私はsedを使用するソリューションを好んでいますが、このソリューションがawkなどの他のツールを使用して実装するのが簡単な場合は歓迎します。

ベストアンサー1

sedを使う

テストファイルを作成しましょう。

$ seq 10 >file

5行目をファイルの先頭に移動するには:

$ sed '1,4{H;1h;d}; 5{p;x}' file
5
1
2
3
4
6
7
8
9
10

どのように動作しますか?

  • 1,4{H;1h;d}

    これにより、行1〜4が予約済みスペースに保存されます。

    具体的には、予約済みHスペースに改行を追加した後、予約済みスペースに現在の行を追加します。 1行目の場合は改行文字は必要ないため、1h1行目を改行なしで予約済みスペースに送信するコマンドを実行します。このdコマンドは、印刷されないようにパターン空間から現在の行を削除します。

  • 5{p;x}

    これにより、5行が印刷され、予約済みスペースが印刷されます。 psedにパターンスペース(行5を含む)を印刷するように指示します。 xこれで、予約済みスペースの内容を印刷するようにsed putにモードと予約済みスペースを交換するように指示します。

5行目以降の行は変更されません。

awkを使う

$ awk 'NR<5{s=s ORS $0;next} NR==5{print $0 s;next} 1' file
5
1
2
3
4
6
7
8
9
10

ここのロジックはsedのロジックと非常によく似ています。 5行前のすべての行を変数に保存しますs。 5行目に達すると、それを印刷してからsを印刷します。残りの行は変更されません。

おすすめ記事