AAsomeArbitraryStringBB
すべての項目を見つけてCCsomeArbitraryStringDD
。
だから
AAHelloBB
Text
AAByeByeBB
~になる
CCHelloDD
Text
CCByeByeDD.
代替文字列には検索文字列の一部が含まれていることに注意することが重要です。
答え1
これはコマンドの基本操作ですsed
。
sed 's/AA\(someArbitraryString\)BB/CC\1DD/g'
最後に、すべての「任意の文字列」に対してこれを行うには、次のようにします。
sed 's/AA\(.*\)BB/CC\1DD/g'
答え2
sed "s/\([AB]\)\1\1*/\n&\n/g
s/AA\n\([[:alnum:]]\{1,\}\)\nBB/CC\1DD/g
s/\n//g
" <<\INPUT
AAHelloBB Text AAByeByeBB
INPUT
AA>>CC&&BB>>DD
私は、代替が2つのセットの間に1つ以上の英数字がある場合にのみ実行する必要があり、常に可能な状況にできるだけ近づく必要があると思います。
例では、次を印刷します。
CCHelloDD Text CCByeByeDD
最も難しい部分は、s///
最初の交換ステートメントで行われます。パターンスペース内のすべての項目の頭部と末尾にエリーン文字を配置します\n
。分離は時々難しいかもしれません。多くの場合、前の区切り記号を配置すると、後続の区切り記号の位置が変更される可能性があり、その逆も同様です。編集内容を編集する必要がないように、可能な場合は常に1つの範囲内でこの手順を実行しようとしています。AAA*
BBB*
だから私たちはそれを見ることができますが、結果のパターンのすべての発生について、パターン空間は左から右にスキャンされることを考慮する必要があります。なぜなら、グローバルフラグを最後にsed
追加するからです。g
代替文。s///
[AB]
- スキャンが最初またはシリーズのいずれかを検出すると、sed
スキャンが一時停止します。次に、次を探します。A
B
\([AB]\)\1\1*
- シーケンスが続く限り、直後に続く同じ文字の1つ以上と連続した同じ文字の一部/すべて。逆参照を使用してその内容を参照できるように、[AB]
文字クラスを\(
サブ式にグループ化します。\)
\1
[AB]\{2,\}
これは実行とは異なり、そのよう\([AB]\)\{2,\}
な場合は両方ともsed
パターンと一致すると見なされるためです。代わりに、一致グループに追加されたすべての文字は上記の最初の一致と同じです。A
B
[AB]
\n&\n
- 交換の右側には、s///
一致したシーケンス全体を引用し、先頭と末尾に改行文字を&
挿入します。\n
- 多くのsはewlineの右側のバックスラッシュエスケープを
sed
サポートしていません。\n
この場合、\n
代わりにリテラルewline文字を使用できますn
。
- 多くのsはewlineの右側のバックスラッシュエスケープを
l
例入力文字列の代替結果は次のとおりです。s///
\nAA\nHello\nBB\n Text \nAA\nByeBye\nBB\n
\n
追加のewline文字を挿入することに加えて、sed
(これは編集後にパターンスペースにしか現れないほぼ唯一の文字です。) sed
文字列はまったく変更されません。入力文字は変更されません。
AAA*
また、各ORシーケンスがewlinesBBB*
内にすぐに含まれることがわかります。それで、次回グローバル交換\n
作業をする際にこう申し上げます。g
s///
sed
AA\n
- 各ゲームはシーケンスが終了した直後から始まりますAAA*
。\([[:alnum:]]\{1,\}\)
- 1 つ以上の英数字。今すぐ次のBBB*
場所AAA*
BBB*
二つ\n
それらの間には中間線があります。この英数字シーケンスの後には、次のものが必要です。\nBB
- シーケンスの先頭BBB*
。
そして右側に...
CC\1DD
AA\n
- w/をそれ自体、w/に置き換えます。CC
\1
\nBB
DD
この時点で1l
シーンが公開されます...
\nCCHelloDD\n Text \nCCByeByeDD\n
...完全に成功しました!今私たちがしなければならないことは...
`s/\n//g`
...残りの行\n
区切り文字をすべて削除すると、操作は完了します。
これは、キーボードを数秒間ランダムに叩いた結果が入力としてレンダリングされた結果です。これははるかに複雑な入力の例なので、\n
ここのドキュメントでエスケープされた行を使用して分割しました。シェルは、1行の結果を入力に渡すsed
前にここに表示されるすべての改行を削除します。
sed ... <<IN
AA kj \
BB\
AAAAAABAkl\
AAAAasjd\
AAAAfo\
BB\
AAia\
BBsdfjomAl\
BBks\
BBmdlmdsviom\
BB\
AAiodsvgmnoi
IN
...そしてl
最初の交換s///
後のook:
\nAA\n kj \nBB\n\nAAAAAA\nBAkl\nAAAA\nasjd\nAAAA\nfo\nBB\n\nAA\nia\nBB\nsdfjomAl\nBB\nks\nBB\nmdlmdsviom\nBB\n\nAA\niodsvgmnoi
...そして2番目は...
\nAA\n kj \nBB\n\nAAAAAA\nBAkl\nAAAA\nasjd\nAACCfoDD\n\nCCiaDD\nsdfjomAl\nBB\nks\nBB\nmdlmdsviom\nBB\n\nAA\niodsvgmnoi
...そして最終製品は...
AA kj BBAAAAAABAklAAAAasjdAACCfoDDCCiaDDsdfjomAlBBksBBmdlmdsviomBBAAiodsvgmnoi