
私はregexとsedに初めて触れ、単純なregexと思われるものを作ろうとしています。単語の末尾の文字を削除したい(「o」の場合)。
- 入力文字列:こんにちはこんにちは
- 予想出力:地獄地獄
良いニュース:文字列の末尾にある「o」を削除できます。
$ echo 'Hello Hello' |sed 's/\(.*\)o/\1/g'
Hello Hell
$ echo 'Hello Hello' |sed 's/\(.*\)o$/\1/g'
Hello Hell
悪いニュース:文字列の前の単語からその単語を削除することはできません。私は私が考えることができるすべてのアンカー記号を試しました。その結果、単語の末尾にある「o」は1つも削除されませんでした。
$ echo 'Hello Hello' |sed 's/\(.*\)o\b/\1/g'
Hello Hello
$ echo 'Hello Hello' |sed 's/\(.*\)o\>/\1/g'
Hello Hello
$ echo 'Hello Hello' |sed 's/\(.*\)o\W/\1/g'
Hello Hello
$ echo 'Hello Hello' |sed 's/\(.*\)o\s/\1/g'
Hello Hello
私が間違ったことを教えて、私の精神を取り戻すのを手伝ってもらえますか?
更新:私は私のマシンが他の人のマシンとは異なる結果を生み出すという明確な印象を受けました。私はMacbookでターミナルウィンドウを使用しています。誰もがこれについて明らかにすることができれば教えてください。
答え1
echo 'Hello Hello' | sed 's/o$//'
あなたよりも私にとってもっと役に立つと思います。
echo 'Hello Hello' | sed 's/\(.*\)o$/\1/g'
あなたの質問は出力に関するものです
echo 'Hello Hello' | sed 's/\(.*\)o\b/\1/g'
はいHello Hello
、しかし私にとってはそうですHello Hell
。で修正してください
echo 'Hello Hello' | sed 's/\([^o]*\)o\b/\1/g'
しかし、
echo 'Hello Hello' | sed 's/o\b//g'
私にとってはより良いようです。
答え2
o
単語の終わりを削除すると、単語文字と単語以外の文字(またはEOL)の間のaoが削除されます。
sed -r 's/(\w)o(\W|$)/\1\2/g'
答え3
space
あなたの単語の区切り記号ではないかと思います。以下を試してください。
$ echo hello hello | sed -e 's/o / /g;s/o$//'
hell hell
この例の問題は、.
andや他の単語区切り文字にも,
同じことを行う必要があることです。一致の後にlikeo
などの他の特定の文字が続きます。何らかの理由でEOLでは機能しないため、を使用して別の検索文字列を追加してください。例:[]
o[ \.,]
$
;
$ echo hello hello, hello. toot hello | sed -e 's/o\([ \.,]\)/\1/g;s/o$//'
hell hell, hell. toot hell
$ echo $SHELL
/bin/bash
$ sed --version
sed (GNU sed) 4.4
$ set | grep IFS
IFS=$' \t\n'
答え4
私は私が考えることができるすべてのアンカー記号を試しました。
アンカーではなく、アスタリスクと貪欲な一致をしているという事実です。この\(.*\)o
マッチ可能な限り長い文字列だから全部食べる最後 o
。o
前の項目と一致することもできます。
しかし、何かをつかんで返すことは役に立ちません。\(.*\)
とを削除できます\1
。
したがって、(少なくともGNU sedでは)o
単語の終わりにあるエントリを削除します。
sed 's/o\>//g'
sed 's/o\b//g'
もちろん、これは文字列の終わりにのみ当てはまります。
sed 's/o$//g'
o
これにより、次の単語以外の文字(次のスペースなどHello
)も削除されます。
sed 's/o\W//g'
/またはをsed
サポートしていない場合は、別の措置を講じる必要があります。これは、英数字以外の文字または行末が続くものと一致します。\<
\>
\b
o
$ echo "jello, jello" | sed -E -e 's/o([^[:alnum:]]|$)/\1/g'
jell, jell
sed
これは、たとえばOS X / macOSに付属のオペレーティングシステムに適用されます。
Perl正規表現は疑問符を追加したり、*
欲張り+
にならないようにすることをサポートします。それから彼らは一致するでしょう最短可能な文字列:
echo "jello, jello" | perl -pe 's/(.*?)o/$1/g'
jell, jell