単語(文字ではない)に置き換えるには、「sed」を使用してください。

単語(文字ではない)に置き換えるには、「sed」を使用してください。

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

次のようにこれを達成できます。theAssume 行に最大 1 つのインスタンスがあるとします。:

 sed -E 's/.*\Wthe(\W.*)/REPLACED\1/'

the最後の項目までのすべての内容が代替テキストで置き換えられます(正規表現は貪欲であることを覚えておいてください)。

  • 、で終わる単語以外の文字を含む単語以外の文字で囲まれtheた(たとえば、部分単語の一致を防ぐために)、キャプチャグループで最後に発生した以降のすべての項目を保存します。theoreticalthe( ... )
  • \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// /と-Rast-open //)だけを知っています。他の場合、一致リテラルまたはAND / matchは、エラー(0または1)と組み合わせた演算子(0以上)として理解されるものと同じです。-E-A-X-Psed??-E-r*?**?

sedサポートされていない実装の場合、置き換えたい*?コンテンツが単一x文字の場合(s/[^x]*x/REPLACE/例:*x[^x]xx

ゼロ文字以上の文字をできるだけ表現できないため、1文字より長い文字列には使用できません。「the」を含めないでください。。したがって、他のアプローチが必要です。

s/the/REPLACEMENT/最初の発生を変更します。したがって、文字列が最初に発生する前にすべてを変更する標準の一般的な方法は、改行the文字で置き換えてから(そうでなければパターンスペースに表示されないように)、改行文字sedを置き換えることです。以前のすべて:

sed 's/the/\
/;s/.*\n//'

答え3

すべてを最初のものに置き換える必要がある場合は、the基本正規表現と拡張正規表現の両方を認識しない貪欲ではない数量子が必要になります。

この場合、sed必須でない場合は次のものを使用できますperl

perl -pe 's/.*?\Wthe/REPLACED/'

最も多くの出現を置き換える必要がある場合nn出現回数):

perl -pe 's/(.*?\Wthe){1,n}/REPLACED/'

関連情報