web-dev-qa-db-ja.com

最後の行の前にN行のテキストを挿入する

最終行の前の2行に新しい行を挿入したい。したがって、私の元のファイルが:

1
2
3
4
5

結果は

1
2
3
New line
4
5
7
Gautam

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

,pw)に変更されます。

この後者は、このジョブでexを同様に使用する方法でもあります。

printf '$-1i\nNew line\n.\nw\n' | ex -s file

edexは、システムに付属する必要がある(フルスクリーンエディターではなく)標準のライン指向エディターです。ご了承ください -sはそれぞれに異なることを意味しますが、このようなバッチモード編集タスクを実行する場合は両方に適しています。

  • ed 。 「シェルとユーティリティ」。 基本仕様。 IEEE 1003.1:2017。オープングループ。
  • ex 。 「シェルとユーティリティ」。 基本仕様。 IEEE 1003.1:2017。オープングループ。

参考文献:

  • Dale Dougherty and Tim O'Reilly(1987)。 「高度な編集」。 nixテキスト処理。ヘイデンの本。
14
Kusalananda

単純なheadtailで実行できます。

$ 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
4
mkmayank

GNU sedも使用できます:

sed -zE 's/(\n[^\n]*){3}$/\nNew-line&/' infile

ファイルの3番目の最後の行にNew-line行を挿入します(最後の行の2行前に行を挿入します)。

この(\n[^\n]*){3}$\newlineに一致し、その後に\newline以外のすべてが一致します。ファイルの最後から最大3回、ここで-zオプションのケーシングsedを読み取ります単一行としてのファイル(NUL文字で区切られた行)。したがって、以下のみに一致します(私が強調表示したアスタリスクの間)。

3*\n
4\n
5\n*

移植性、あなたは使用します:

sed -e ':t;N;$!bt; s/\(\n[^\n]*\)\{2\}$/\nNew-line&/' infile

それでもsedが交換部品の\newlineを処理できない場合は、実際の改行を入れるか、 Ctrl+V に続く Enter Enterキーの^M制御文字を出力します:

sed -e ':t;N;$!bt; s/\(\n[^\n]*\)\{2\}$/\
New-line&/' infile

使い方

Nは各行を追加しますsedをパターンスペースに読み取り、すべての行が読み取られるまで新しい行を追加します。 :tはラベルを定義し、$!btはファイルの終わりでない限り、tというラベルにジャンプしてsedに移動します。

4
αғsнιη

awkをフォローすることも役立ちます。

awk -v line=$(wc -l < Input_file) -v val="new_line" 'FNR==(line-1){print val} 1' Input_file
1
RavinderSingh13

これは、挿入された行の内容に対して非常に堅牢でなければなりませんが、ファイルを2回スキャンする必要があります(最初のパスではwc)。

sed "$(($(wc -l < yourfile)-$N))a"'new line' yourfile
1
Philippos
sed -e '
   1N
   $!{N;P;D;}
   H;g;s/^/NEW_LINE/
' input-data.txt

使い方

  • パターン空間では常に2つのイネスを維持します。
  • パターンスペースの2行のうち最初の行を印刷し、切り取り、次の行を読み取って追加します。
  • 最後の行がパターンスペースに読み込まれていない限り、すすぎ...泡...繰り返します。
  • その時点で、先頭に改行(\ n)を挿入し、そこに必要な文字列を配置します。
  • これはPOSIX-lyですsed
0
Rakesh Sharma
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
0
MiniMax