sed
構文を使用して文字を除外する方法を知っていますが、[^xxxx]
単語を除外する方法は何ですか?たとえば、私の変数は次のようになります。
var="
Now is the time
for all good men
to come
to the aid
of the party"
今:
echo $var | sed ...
...私が言いたいことは次のとおりです。
REPLACED time
for all good men
to come
REPLACED aid
REPLACED party
...簡単にする必要がありますが、どうすればいいかわかりません。
echo $var | sed -r 's/^[^the]*the/REPLACED/'
...多少似ていますが、t
h
e
単語ではなく単一の文字に一致しますthe
。
何度も発生する最初のイベントまで、または特定のイベントが発生するまですべてを交換できるソリューションがある場合は、より良いでしょう。
答え1
次のようにこれを達成できます。the
Assume 行に最大 1 つのインスタンスがあるとします。:
sed -E 's/.*\Wthe(\W.*)/REPLACED\1/'
the
最後の項目までのすべての内容が代替テキストで置き換えられます(正規表現は貪欲であることを覚えておいてください)。
- 、で終わる単語以外の文字を含む単語以外の文字で囲まれ
the
た(たとえば、部分単語の一致を防ぐために)、キャプチャグループで最後に発生した以降のすべての項目を保存します。theoretical
the
( ... )
\1
その後、行を代替テキストに置き換え、その後にキャプチャグループ(検索パターンの最初のグループであるため、いわゆる呼び出されます)の内容が続きます。終了文字the
も代替テキストとして送信するには、少し複雑なアプローチが必要です。
全部交換したいなら最初これが発生した場合は、次の方法を使用する必要がありますawk
。
awk '(i=match($0,/\Wthe\W/)){print "REPLACED" substr($0,i+4);next} 1'
これは、単語ではなく文字で囲まれた文字列がそのthe
行にあることを確認し、場所を変数に保存しますi
。
- 0 以外の場合は、
i
現在の入力行から始まる代替テキストとサブストリングを印刷します。後ろにが表示されますが、the
そうでない場合は、次の行に実行をスキップします。 - 0の場合は、
i
現在行をそのまま印刷します。
答え2
s/.*the/REPLACED/
the
これは.*
貪欲であり、できるだけ多くの一致を望んでいるので、一番右に発生するすべてを置き換えます。
.*
0 文字以上 ( *
) 文字 ( .
) です。多いほど良いthe
正規表現の次の部分と一致する必要がある最後の項目を除いて、すべての項目を喜んで飲み込みますthe
。
約30年前、5は以前のperl
コンテンツと0個以上一致する:のバリエーションを導入したが*
*?
できるだけ少ない:
printf '%s\n' "$var" | perl -pe 's/.*?the/REPLACED/'
これらの新しい演算子のサポートをsed
追加した人はほとんどいません。perl
私は2つの実装(ssed
// /と-R
ast-open //)だけを知っています。他の場合、一致リテラルまたはAND / matchは、エラー(0または1)と組み合わせた演算子(0以上)として理解されるものと同じです。-E
-A
-X
-P
sed
?
?
-E
-r
*?
*
*
?
sed
サポートされていない実装の場合、置き換えたい*?
コンテンツが単一x
文字の場合(s/[^x]*x/REPLACE/
例:*
x
[^x]
x
x
ゼロ文字以上の文字をできるだけ表現できないため、1文字より長い文字列には使用できません。「the」を含めないでください。。したがって、他のアプローチが必要です。
s/the/REPLACEMENT/
最初の発生を変更します。したがって、文字列が最初に発生する前にすべてを変更する標準の一般的な方法は、改行the
文字で置き換えてから(そうでなければパターンスペースに表示されないように)、改行文字sed
を置き換えることです。以前のすべて:
sed 's/the/\
/;s/.*\n//'
答え3
すべてを最初のものに置き換える必要がある場合は、the
基本正規表現と拡張正規表現の両方を認識しない貪欲ではない数量子が必要になります。
この場合、sed
必須でない場合は次のものを使用できますperl
。
perl -pe 's/.*?\Wthe/REPLACED/'
最も多くの出現を置き換える必要がある場合n
(n
出現回数):
perl -pe 's/(.*?\Wthe){1,n}/REPLACED/'