現在実行中のsedに追加すると、なぜ機能しないのですか?

現在実行中のsedに追加すると、なぜ機能しないのですか?

次のテキストファイルがあります。

(empty) 
str
int
int 

s/^/\</gこれを現在のsedに追加すると(make it 's/\&/\</g;s/\</\ /g;s/^/\</g')、これが出力されます。

< ##only this line gets a < 
str
int
int 

ただし、たとえば、新しい行を作成してコマンド全体を入力すると、sed -i '' 's/^/\</g' *.p*次のような結果が出力されます。

< 
<str
<int
<int 

違いは何ですか?

ベストアンサー1

違いは入力と出力です。最初のケースでは\n改行を挿入しました。しかし、まだ同じパターン空間で作業しているので、パターン^空間の先頭は挿入された改行が含まれていても所定の位置に残ります。これが発生するたびに改行を挿入します<

ただし、2番目の場合はnewを使用し、sed最後のseds出力を入力として読み込みます。したがって、すべての改行は別々の入力行として最初のループカウントと共に注入され、各改行には独自の^パターン空間ヘッダがあります。

echo ..... | 
sed 's/./&\
/g;s/^/sed1/' |
sed 's/^/sed2/'

sed2sed1.
sed2.
sed2.
sed2.
sed2.
sed2

しかし…

sed 's/&/</g;s/</\
/g'

...書くのが簡単かもしれません...

sed 'y/&</\n\n/'

...しかし、それぞれの後に改行を追加して[&<]それぞれを置き換えるには、&<のようにします。

sed 's/[&<]/<\
/g'

...しかし、出力が入力とまったく一致しません...

おすすめ記事