私は次のことをしようとします:
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