"something.swf"パターンと一致しないtxtファイルのすべてのコンテンツを削除してください。

"something.swf"パターンと一致しないtxtファイルのすべてのコンテンツを削除してください。

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.txtinput.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)
    }
  }'

(パターンスペースの最初の行はループから削除されました。Dsed

答え3

awk1つの方法は次のとおりです。

$ 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'

関連情報