sedで()内に改行文字を使用する方法は?

sedで()内に改行文字を使用する方法は?

交換したいときは、Dot次のように言ってください。

Dot
##empty line##

私はこうする:

sed 's/Dot/Dot\
/g'

はい、文字通りの新しい行がBSDで機能する方法ですsed。ただし、sed括弧内にある場合は同じことはできません。コマンド例:

lol=$(echo $varcontaining something | sed 's/Dot/Dot\
/g')

を(空白)に置き換えるからです。

答え1

このStackoverflow Q&Aで言及されている次の方法はどうですか?BSD sedで改行置換を使用する方法は?:

sed -e 's/ /\'$'\n/g'

あるいは、別の方法で次のように変数に改行文字を入れます。

cr="
"

次に変数を使用します。

sed "s/ /\\${cr}/g"

答え2

Shellは末尾の改行文字を削除します。一般的な回避策は、コマンド置換の末尾に文字を追加してから削除することです。

x=$( echo a; echo ; echo :)
echo "${x%:}"

答え3

私の考えの最も効率的な方法は、おそらくを使用することですeval。シェル拡張からリテラル値を取得するには、これを取得する最も直接的な方法はリテラル入力から取得することです。値はシェルの出力から取得したものであるため、再入力する必要があります。

通常、二重引用符を使用するのが'最も簡単です。'ハード引用符文字列の簡単な引用規則は、'ハード参照を含めることができないことです。このコンテキストでハード参照を解釈する唯一の方法は、2つ以上の引用符付き文字列を一緒に連結することです。

VAR='string'\''more string'

これにより、最初の引用符付き文字列は2番目の引用符で終わり、2番目の引用符付き文字列はバックスラッシュでエスケープされたハード引用符で、3番目は4番目の引用符になります。

だとしたら、国ならどうしたらいいですか?

eval "lol='$(nl='\
';    printf %s\\n "$lol" |
      sed "s/Dot/&$nl/g
           s/'"'/&\\&&/g
          $s/$/'"'/
")"

このように、printfvar値に追加された同じ末尾の改行文字は、コマンド置換によって削除された改行文字です。最後の2番目の文字は常に二重引用符であるため、出力の最後の文字でもあり、エスケープ可能であるevalため、ドアを安全に分離します。sed可能な入力に現れる二重引用符があり、文字列の先頭に1つがあります。

しかし、実際には、このようなコマンド置換を使用することは一般的に良い習慣ではありません。おそらく、これが常に適切であるとは限りません。このようにフィルタを微調整するよりも、プロセスの各プロセスループのすべての出力を収集して、単一のストリームから直ちにパイプラインの他のフィルタプロセスに渡す方が効率的です。

シェル変数に非常に大きな値がない限り(これも一般的に悪い考えです)、次の方法がより良いアプローチかもしれません。

set -- "$lol" 
while case "$1" in (*Dot*)
set -- "${1%Dot*}" "${1##*Dot}Dot
$2";;(*) ! lol=$1$2;; esac
do :; done

答え4

\nキャリッジリターンで改行を使用できます\rsedテストするBSDはありませんが、GNUで動作しますsed

$ var=Dot
$ lol=$(echo $var | sed 's/Dot/Dot\n\r/g')
$ echo "$lol"
Dot

$

BSDがsedそれをサポートしていない場合、\rもう1つ(やや醜い)解決策は、次の方法を使用または\n\r印刷echo -eすることですprintf

lol=$(echo $var | sed "s/Dot/Dot\\$(printf '\n\r')/g")

関連情報