最終行の前の2行に新しい行を挿入したい。したがって、私の元のファイルが:
1
2
3
4
5
結果は
1
2
3
New line
4
5
ed
の使用:
$ printf '$-1i\nNew line\n.\n,p\n' | ed -s file
1
2
3
New line
4
5
ed
編集スクリプト:
$-1i
New line
.
,p
これは最初に最後から1行上に移動します($-1
)そしてその行の上に(i
)新しい内容を挿入します。挿入された内容は単一のドットで終了します(複数行にすることもできます)。最後 ,p
は、変更されたバッファ全体を端末に表示します。
これを新しいファイルにリダイレクトするか、次を使用して元のファイルに書き戻すことができます
printf '$-1i\nNew line\n.\nw\n' | ed -s file
(,p
はw
)に変更されます。
この後者は、このジョブでex
を同様に使用する方法でもあります。
printf '$-1i\nNew line\n.\nw\n' | ex -s file
ed
とex
は、システムに付属する必要がある(フルスクリーンエディターではなく)標準のライン指向エディターです。ご了承ください -s
はそれぞれに異なることを意味しますが、このようなバッチモード編集タスクを実行する場合は両方に適しています。
ed
。 「シェルとユーティリティ」。 基本仕様。 IEEE 1003.1:2017。オープングループ。ex
。 「シェルとユーティリティ」。 基本仕様。 IEEE 1003.1:2017。オープングループ。参考文献:
単純なhead
とtail
で実行できます。
$ output=$(head -n -2 file ; echo 'new line' ; tail -2 file)
$ echo "$output" > file
コメントで述べたように、末尾の空白行はすべて削除されます。したがって、末尾の空白行を保持するために、
$ head -n -2 file >> file.tmp
$ echo 'new line' >> file.tmp
$ tail -2 file >> file.tmp
$ mv file.tmp file
またはシングルライナー
$ head -n -2 file >> file.tmp ; echo 'new line' >> file.tmp; tail -2 file >> file.tmp ; mv file.tmp file
GNU sed
も使用できます:
sed -zE 's/(\n[^\n]*){3}$/\nNew-line&/' infile
ファイルの3番目の最後の行にNew-line
行を挿入します(最後の行の2行前に行を挿入します)。
この(\n[^\n]*){3}$
は\n
ewlineに一致し、その後に\n
ewline以外のすべてが一致します。ファイルの最後から最大3回、ここで-z
オプションのケーシングsedを読み取ります単一行としてのファイル(NUL文字で区切られた行)。したがって、以下のみに一致します(私が強調表示したアスタリスクの間)。
3*\n
4\n
5\n*
移植性、あなたは使用します:
sed -e ':t;N;$!bt; s/\(\n[^\n]*\)\{2\}$/\nNew-line&/' infile
それでもsed
が交換部品の\n
ewlineを処理できない場合は、実際の改行を入れるか、 Ctrl+V に続く Enter Enterキーの^M
制御文字を出力します:
sed -e ':t;N;$!bt; s/\(\n[^\n]*\)\{2\}$/\
New-line&/' infile
N
は各行を追加しますsedをパターンスペースに読み取り、すべての行が読み取られるまで新しい行を追加します。 :t
はラベルを定義し、$!bt
はファイルの終わりでない限り、t
というラベルにジャンプしてsedに移動します。
awk
をフォローすることも役立ちます。
awk -v line=$(wc -l < Input_file) -v val="new_line" 'FNR==(line-1){print val} 1' Input_file
これは、挿入された行の内容に対して非常に堅牢でなければなりませんが、ファイルを2回スキャンする必要があります(最初のパスではwc
)。
sed "$(($(wc -l < yourfile)-$N))a"'new line' yourfile
sed -e '
1N
$!{N;P;D;}
H;g;s/^/NEW_LINE/
' input-data.txt
sed
tac input.txt | sed '2 a New line' | tac
説明
tac
-行を逆に印刷するため、最後の行が最初の行、last - 1
行が2番目になる、など.sed '2 a New line
-追加New line
2行目以降。tac
-改行します。テスト
$ tac <(seq 1 5) | sed '2 a New line' | tac
1
2
3
New line
4
5