文字列を処理しています。
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; }'
g
Perlバリアントがパターンの繰り返しインスタンスを処理するように、代替アイテムにフラグを追加するだけです。
perl -pe 's/\*\*(.*?)\*\*/FOO$1FOO/g'