サフィックスが存在しない場合にのみ、テキストの一部の行にサフィックスを追加します。

サフィックスが存在しない場合にのみ、テキストの一部の行にサフィックスを追加します。

私は次のことをしようとします:

sed -i.bak '/^startswith/ s/$/endswith/' /path/to/file

しかし、ただ以下を行う行の場合いいえすでに「endswith」という文字列で終わりました。

つまり、いくつかのテキストで始まり、次のことを行う行を探したいと思います。いいえ別のテキストで終わり、行の末尾に必要なテキストを追加します。

私が現在言及している他の部分文字列が存在しない場合にのみ、部分文字列を検索して置き換えます。マニュアルページもsedありますが、私が正しい道を行っているかどうかはわかりません。

答え1

次の方法が有効です。

sed -i.bak '/endswith/b; /^startswith/ s/$/endswith/' /path/to/file

しかし、これが最も効率的なソリューションであるかどうかはわかりません。

答え2

私が正しく理解した場合:

sed '/^startswith/s/endswith$//; /^startswith/s/$/endswith/' /path/to/file

左から右へ:
/^startswith- 次から始まるすべての行を見つけます。'によって。 。スタート」,
s/endswith$//- デフォルトでは、末尾/サフィックスを削除します。'によって。 。終わる
/^startswith- 再び次から始まるすべての行を見つけます。'によって。 。スタート」
s/$/endswith/- 今はすべて「^スタート」行末に「endswith」がないので、追加してください。

答え3

ただawkを使用してください:

awk '/^startswith/{ sub(/(endswith)?$/,"endswith") } 1' /path/to/file

答え4

Raku(以前のPerl_6)の使用

raku -pe 's/ (^^ header \s .* $$) /$0 trailer/ unless /trailer $$/;'  

入力例:

header 0123456789
header 0123456789 trailer
none   0123456789 trailer
none   0123456789

出力例:

header 0123456789 trailer
header 0123456789 trailer
none   0123456789 trailer
none   0123456789

https://docs.raku.org/syntax/s$SOLIDUS$SOLIDUS$SOLIDUS
https://raku.org

関連情報