sed
これは可能ですかawk
?私がやりたいことは、このパターンと一致しないものをすべて削除することです。'(something).swf'
これらのコマンドは不要で、私は初心者です。テキスト処理は端末を介して行われるので、出力を表示するだけでなく、テキストファイルとして保存したいと思います。
はい。
次のように入力すると:
Hey stackoverflow im 23 years old 'lol.swf' and '33.swf'
次のように出力する必要があります。
'lol.swf'
'33.swf'
答え1
私は単にgrepを使用します(ここではGNUを想定していますgrep
):
grep -o "'[^']*\.swf'" input.txt > output.txt
説明する
-o
行全体ではなく一致する部分のみを印刷してください。"'[^']*\.swf'"
"
含めることができるように一致させるパターン'
。これは最初の文字'
と一致し、その後に[^']*
未決定の数の非'
文字が続き、その後に(正規表現で特別な意味があるため、エスケープする必要が.swf
あります)。.
\.
.
input.txt
読み取る入力ファイルです。> output.txt
出力はこのファイルにリダイレクトされます。このセクションを削除すると、画面で出力をプレビューできます。
選ぶ
GNUがインストールされていない場合は、次のことをgrep
試すことができます(terdonに触発されました)代替アイデア)。
tr -d '\n' <input.txt | tr "'" '\n' | head -n -1 | tail -n +2 | grep '.*\.swf$' > output.txt
説明する
tr -d '\n' <input.txt
input.txt
すべての改行文字()を読み取って削除します\n
。tr "'" '\n'
すべて'
改行文字に変換してください。これは、すべての行が前に囲まれていることを意味します'
。head -n -1 | tail -n +2
。ただし、元のテキストファイルがで始まったりsomething.swf'
終わったりすると'something.swf
、1つだけが1行を占め、'
次のエラーとして検出されますgrep
。ただし、最初または最後の文字列に2つの引用符が正しく含まれている場合、このステップの先頭または末尾に追加の改行があります。したがって、このコードは、このシナリオにのみ一致するように最後の行と最初の行を削除します。grep '\.swf$'
で終わる行と一致します.swf
。
答え2
grep
サポートしていない場合は、以下を使用-o
できますperl
。
perl -lne "print for /'.*?\.swf'/g" < in.txt > out.txt
そしてsed
:
sed -n "/\('[^']*\.swf'\)/{s//\n\1\n/;s/.*\n\(.*\n\)/\1/;P;D;}"
これは次のとおりです。
awk '
{
while(match($0, '"/'[^']*\.swf'/"')) {
print substr($0, RSTART, RLENGTH)
$0 = substr($0, RSTART+RLENGTH)
}
}'
(パターンスペースの最初の行はループから削除されました。D
)sed
答え3
awk
1つの方法は次のとおりです。
$ awk "{for(i=1;i<=NF;i++){if(\$i~/'[^']*.swf'/){print \$i}}}" file
'lol.swf'
'33.swf'
GNUではなくgrepもあります。すべてのスペースを改行に変更し、一般を使用してくださいgrep
。
$ sed 's/ /\n/g' file | grep "'[^']*.swf'"
'lol.swf'
'33.swf'