sed を使用して文字列を適切にトリムし、パターンが存在しない場合に文字列を削除しないようにするにはどうすればよいですか?

sed を使用して文字列を適切にトリムし、パターンが存在しない場合に文字列を削除しないようにするにはどうすればよいですか?

zsh私は文字列を持つ関数を書いています

"find . -a -print:10"

:10右側の部分をトリミングする必要があります。これは将来的に または などに変わる可能性があるので:23:77のようなパターン:[0-9]+が必要になるようです。

また、文字列は次の形式になるかもしれません

find . -a -print

:[0-9]+その場合、末尾にパターンがなければ、文字列は変更されません。

それで

  • find . -a -print:10なるはずでありfind . -a -print
  • find . -a -printそのままにしておくべきfind . -a -print

これまで試したこと

% sed -nr 's/(.*)(:[0-9]+)?/\1/p' <<<'find . -a -print:10'
find . -a -print:10     # ':10' not getting trimmed

もし私が試したら

sed -nr 's/(.*)(:[0-9]+)/\1/p' <<<'find . -a -print:10'
find . -a -print  # ':10' getting trimmed GOOD ✔✔ 

しかし、同じsed表現

 sed -nr 's/(.*)(:[0-9]+)/\1/p' <<<'find . -a -print'
 # no output

この文字列を正しくトリミングするにはどうすればよいでしょうか?

答え1

-nデフォルトの出力を抑制したくない場合は、なぜ を使用するのですか?

次のように使用します:

sed -E -e 's/:[0-9]+$//'

関連情報