web-dev-qa-db-ja.com

sedを使用して行の後に改行/改行を挿入するにはどうすればよいですか

これを行う方法を見つけるのにしばらく時間がかかったので、他の誰かが同じことを探している場合に備えて投稿してください。

28
realityloop

パターンの後に改行を追加するには、次のように言うこともできます。

sed '/pattern/{G;}' filename

引用 GNU sedマニュアル

G
    Append a newline to the contents of the pattern space, and then append the contents of the hold space to that of the pattern space.

編集:

ちなみに、これはたまたま sed one liners でカバーされています:

 # insert a blank line below every line which matches "regex"
 sed '/regex/G'
27
devnull

このsedコマンド:

sed -i '' '/pid = run/ a\
\
' file.txt

次の行を見つけます:pid = run

file.txt前

; Note: the default prefix is /usr/local/var
; Default Value: none
;pid = run/php-fpm.pid

; Error log file

file.txt内のその行の後に改行を追加します

file.txt after

; Note: the default prefix is /usr/local/var
; Default Value: none
;pid = run/php-fpm.pid


; Error log file

または、テキストと改行を追加する場合:

sed -i '/pid = run/ a\
new line of text\
' file.txt

file.txt after

; Note: the default prefix is /usr/local/var
; Default Value: none
;pid = run/php-fpm.pid
new line of text

; Error log file
8
realityloop

単純な置換はうまく機能します:

sed 's/pattern.*$/&\n/'

例:

$ printf "Hi\nBye\n" | sed 's/H.*$/&\nJohn/'
Hi
John
Bye

標準に準拠するには、\ nをバックスラッシュ改行で置き換えます。

$ printf "Hi\nBye\n" | sed 's/H.*$/&\
> John/'
Hi
John
Bye
2
Richard
sed '/pattern/a\\r' file name 

パターンの後にリターンが追加され、gがパターンを空白行に置き換えます。

ファイルの最後に新しい行(空白)を追加する必要がある場合は、これを使用します。

sed '$a\\r' file name
2
nemo

別の可能性、例えば空の保持レジスタがない場合、次のようになります。

sed '/pattern/{p;s/.*//}' file

説明:
/pattern/{...} =コマンドのシーケンスを適用し、パターンのある行が見つかった場合、
p =現在の行を出力し、
; =コマンド間の区切り、
s/.*// =パターンレジスタ内の何も置き換えないで、
空のパターンレジスタを追加行として自動的に印刷します)

0
Gerald Schade