sedを使用して文字を含む行を変数に格納されているテキストに置き換えるには?

sedを使用して文字を含む行を変数に格納されているテキストに置き換えるには?

次のテキストを含むファイルentry.txtがあります。

$ cat entry.txt 
>Main entry
This is some text to try
how to substitute the first
line of the text.

>文字を検索して最初の行を置き換え、変数に保存されているいくつかのテキストを追加したいと思います。

$ var=TITLE
$ sed -i "s/>*/$var/" entry.txt 
$ cat entry.txt 
TITLEMain entry
TITLEThis is some text to try
TITLEhow to substitute the first
TITLEline of the text.

どうやってできるか

  1. >>含まれており、分離されていない行全体を置き換えます。

  2. 最初の行だけを変更し、他の行を変更しますか?

ありがとうございます。

答え1

パターンは^>.*()で始まる行のみを一致し、その行()の他のすべての項目と一致する必要があります。だから:>^>.*

sed -i "s/^>.*/$var/" entry.txt

答え2

必要な結果をほとんど推測できますが、予想される結果を提供すると役に立ちます。あなたのテストケースは、最初の行制約ではなく「>」の交換要件のみをカバーしています。また、">"が行の最初の文字でない場合も解決されません。 「-i」(ファイルを所定の位置に編集)ではなく、「-e」(標準入力を標準出力に変更)を使用してsedをテストする方が簡単です。

たぶん私たちは他のテストケースを試すことができます:

>Main entry>
This is some text to try
>how to substitute the first
line of the text.

sed -i "s/>*/$var/" エントリ.txt

ここでパターンはゼロ個以上の「>」インスタンスと一致することを意味しますが、実際には少なくとも1つのインスタンスと一致しようとします。複数のインスタンスをどのように処理する予定ですか?行の先頭でのみ一致する必要がありますか? )

var=INJECT
sed -e "s/.*>.*/$var/" <entry.txt
INJECT
This is some text to try
INJECT
line of the text.

これはもう少し良く見えます。

しかし、sedに到達するようにしてください。ただ最初の行を変更するのははるかに難しいです。 Gnu sedを使用すると、次のようになります。

sed -e "0,/.*>.*/s//$var/" <entry.txt
INJECT
This is some text to try
>how to substitute the first
line of the text.

これはおそらく従来のsedでは、他の方法でこれを行うことは可能ですが、これを達成するためにあきらめてawkを使用しました。

答え3

使用awk:

最初のレコードを変更するには(>レコードの先頭に発生した場合)、次のものを使用できます。

$ awk -v var="$var" '/^>/ && NR==1{$0 = var}1'

>行の先頭に表示される最初のインスタンスの最初の行を変更するには、次のコマンドを使用できます。

$ awk -v var="$var" '/^>/ && !a{$0 = var; a++}1'

関連情報