文字列から途中にピリオドのないすべての単語を削除したいユースケースがあります。誰でもソリューションを提供できますか?それでは、どのように機能するかを説明してください。
文字列の例:
Testy.mctestface 1337 taco
望ましい結果:
Testy.mctestface
答え1
使用grep
:
grep -oE '\w+\.\w+'
\w+
- ランダムな単語の文字一致(等しい[a-zA-Z0-9_]
)
+
- 数量子 - 1回と無限に一致、できるだけ複数回一致、必要に応じて返す(欲)
\.
- 文字通り文字一致.
(大文字と小文字の区別)
オプションは戻りを-o
意味します。grep
ただこのオプションを使用すると、一致時に正規表現-E
を拡張できます。
これはデフォルトでピリオドを含むすべての単語または単語の組み合わせと一致します。
$ echo 'foo bar Testy.mctestface 1337 taco' | grep -oE '\w+\.\w+'
Testy.mctestface
単語に特殊文字を含めることができる場合は、次を使用できます。
grep -oE '\S+\.\S+'
\S+
空白以外の文字を一度から無限まで一致させます。
答え2
おそらく:
sed '
s/.*/ & /
:1
s/ [^ .]\{1,\} / /g
t1
s/^ //;s/ $//'
答え3
答えの少し簡単なバージョンは次のとおりですawk
。
awk '{ for (i=1; i<=NF; i++) if ($i !~ /\./) $i = ""; print; }'
各単語についていいえ支店を含めて破壊します。その後、残りを印刷します。
質問をもう一度読んだとき、「各単語…ピリオドなし」となっていることがわかりました。存在する真ん中~へたとえば、次のように入力します。
Mr. Smith ate .5 pies in New York.
どの単語にもピリオドがないため、出力を生成しないでください。途中で。 対照的に、
Mr.Smith ate 1.5 pies in New York.
報告する必要Mr.Smith
があり、 1.5
したがってコマンドは次のようになります。
awk '{ for (i=1; i<=NF; i++) if ($i !~ /.\../) $i = ""; print; }'
各単語についていいえピリオドと1つ以上の他の文字が含まれているため、単語が破損します。
答え4
{
for(i=1; i <= NF; i++)
if ($i ~ /\./)
out=out" "$i
print out
out=""
}
...ファイルに保存し、awk -f thatfile input1 input2...
次のように実行します。
awk '{ for(i=1; i <= NF; i++) if ($i ~ /\./) out=out" "$i; print out; out="" }' input
...コマンドラインにスクリプトを入力します。
awkは空白(特殊変数のデフォルト値)に基づいてFS
各入力行を自動的に分割します。スクリプトはその分割の各結果フィールドを繰り返し、テストを実行します。フィールド値にピリオドが含まれている場合(ピリオドは正規表現の特殊な表示であるためエスケープされます)、フィールドをスペースとともに追加します。出力する新しいフィールドの末尾に文字列。これはピリオドを含まないフィールドをスキップする効果があります。フィールドのループが完了したら、再構成された値(in out
)を印刷し、入力にさらに多くの行がある場合は空の文字列にリセットします。