POSIX拡張正規表現(sed用)を使用して文字列を除くすべての文字を一致させるにはどうすればよいですか?

POSIX拡張正規表現(sed用)を使用して文字列を除くすべての文字を一致させるにはどうすればよいですか?

文字列を処理しています。

Input File
----
some**wor*ds**with**asterisks

言い換えれば、sedどの文字にも一致します。いいえスター:

echo "some**words** **" | sed -E 's/\*\*([^*]+)\*\*/FOO\1FOO/g'

これにより、以下が正しく出力されます。someFOOwordsFOO **

ただし、これは上記の状況には適用されませんInput File。したがって、私はsedに次の2つのアスタリスクを無視するように言いたいと思います。

sed -E 's/\*\*([^*]+)\*\*/FOO\1FOO}/g' IF

出力されます:

some**wor*dsFOOwithFOOasterisks

私が好きなことは:

someFOOwor*dsFOOwith**asterisks

ベストアンサー1

Perlを使って欲張りにならないように言葉をキャプチャしましょう。

$ echo 'some**wor*ds**with**asterisks' | perl -pe 's/\*\*(.*?)\*\*/FOO$1FOO/'
someFOOwor*dsFOOwith**asterisks

これは、最初の一致から次に**最も近い一致に移動し、一致するビットを間の部分文字**FOOに置き換えてから**置き換えますFOO。貪欲でない一致がない場合、**式の2番目の項目は一致します。最後その後、このような文字列が使用されますwith

使用sed:

$ echo 'some**wor*ds**with**asterisks' | sed '/\*\*.*\*\*/ { s/\*\*/FOO/; s//FOO/; }'
someFOOwor*dsFOOwith**asterisks

**これにより、行の最初の項目がに変わり、FOO次の項目も置き換えられます。ただし、行に**1つと他の項目が含まれている場合にのみ適用されます**

**これら2つの項目が行のどの部分文字列にあるかは気にせず、aが次に**最も近い一致であることに注意してください**。これは上記の両方のコマンドに適用されます。


コメントの例を見てください。

some**wor*ds**with**asterisks some**wor*ds**with**asterisks

sedこれは、これ以上のことがなくなるまで、すでに提供されているソリューションを繰り返す明示的なループとして扱うことができます。

sed -e ':again' -e '/\*\*.*\*\*/ { s/\*\*/FOO/; s//FOO/; b again; }'

gPerlバリアントがパターンの繰り返しインスタンスを処理するように、代替アイテムにフラグを追加するだけです。

perl -pe 's/\*\*(.*?)\*\*/FOO$1FOO/g'

おすすめ記事