このタグは末尾の改行を無視します。

このタグは末尾の改行を無視します。

私はsedを使ってファイルのパターンの上にいくつかの行を挿入しています。ファイルの例

Stuff

Pattern

Stuff

これは、ファイルを分割してテキストを挿入する前に使用するコードです。Pattern

     patternline=$(grep -n "Pattern" "/my/file" | cut -f1 -d:)
     firstcut=$(($patternline -1))

     firstpart=$(sed -n 1,"$firstcut"p "/my/file")
     secondpart=$(sed -n ''"$abspathcomment"',$p' "/my/file")

     # Indentation intentional as snippet is nested within an IF statement
     text=$(cat <<EOF

Text I want to insert with one leading and two trailing new lines


EOF
)

     echo "$firstpart$text$secondpart" > "/my/file"

sedを使ってファイルを分割し、途中で目的のテキストを挿入し、最後にcatを使用してその内容を同じファイルに出力します。

私はファイルの次の出力を得ることを期待しています。

Stuff

Text I want to insert with one leading and two trailing new lines


Pattern

Stuff

しかし、代わりに私は得る

Stuff

Text I want to insert with one leading and two trailing new linesPattern

Stuff

sed または bash が改行文字を削除するかどうかはわかりません。 Bashでファイルに結果を反映するときに結果を保存する方法は?

ベストアンサー1

コマンド置換は末尾の改行を使用します。

a=$( printf 'hello\nworld\n\n\n\n\n\n' )
printf 'a is "%s"\n' "$a"

出力:

a is "hello
world"

sed元の問題を解決するために使用します。

sed '/Pattern/i\
Text I want to insert with one leading and two trailing new lines\
\

' file

またはGNUを使用してくださいsed

sed '/Pattern/i Text I want to insert with one leading and two trailing new lines\n\n' file

ここでは、i(「挿入」)コマンドを使用して、一致sedする行の前に特定の行セットを挿入しますPattern。最初のバリエーションでは、2つの改行文字をエスケープしてsedテキストに挿入できます。結果の先行改行文字は、Pattern最初の改行文字と同じです。

たとえば、これが生成するデータ

Stuff

Text I want to insert with one leading and two trailing new lines


Pattern

Stuff

これの利点は、既存のスペースが変更されないことです。

おすすめ記事