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
現在行をそのまま印刷します。