web-dev-qa-db-ja.com

sedを使用して文字列の最後にあるWordパターンを取り除く

私は次の文字列を持っています:

ksh -x SCRIPT2.ksh $BUSSINESSDATE & PID=$!; ksh -x SCRIPT1.ksh $BUSSINESSDATE & PID=$!;

最後の単語& PID=$!;を取り除きたいです。望ましい結果は次のとおりです。

ksh -x SCRIPT2.ksh $BUSSINESSDATE & PID=$!; ksh -x SCRIPT1.ksh $BUSSINESSDATE

:文字列の途中に& PID=$!;があるので、& PID=$!;を含む最後の単語を削除するだけで済みます。

私はsedを使用してこれを達成しています。しかし、期待どおりの出力が得られないようです。

sed 's/\(\& PID=\$\!\).*$//'
4
Sas
sed -e 's/& PID=\$\!;$//'

$終わりに向かって、文字列の終わりに固定します。

4
ctrl-alt-delor

行の最後に出現するパターンを削除するには、それを絞るだけです。

sed 's/\(.*\)& PID=$!;/\1/'

これは、文字列を照合する前に\1で可能な限り一致するため、削除する文字列が実際に行の末尾にあるかどうかに関係なく、常に最後の出現のみが削除されます。

あなたの試み:

 sed 's/\(\& PID=\$\!\).*$//'

...反対のようなことをします。文字列の最初の出現から始まり、行の終わりまで続く行のすべての文字を削除します。

leftmost-longestルールを覚えておいてください-正規表現は常に文字列の左端まで一致を開始し、可能な限り一致し続けます。


nの最後の文字だけを削除したい場合は、gnu sedを使用することに注意してください。

sed -E 's/.{9}$//'

ここで、拡張正規表現を使用するには、-Eオプションが必要です。

1
mikeserv

これまでのところ、すべての回答は適切ですが、この具体的な例では、時間を節約し、数文字を減らすことができます。

sed 's/ & [^ ]*$//'

またはさらに良い

sed 's/ & \S*$//'
1
jimmij