删除 txt 文件中与此模式“something.swf”不匹配的所有内容

删除 txt 文件中与此模式“something.swf”不匹配的所有内容

可以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(注意,您必须转义 as .\.因为.在正则表达式中具有特殊含义。
  • input.txt是要读取的输入文件。
  • > output.txt会将输出重定向到此文件。如果删除此部分,您可以在屏幕上预览输出。

选择

如果grep未安装 GNU,您可以尝试以下操作(受到 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,则尽管只有一个 ,但这些文件将独占一行',并且会被以下错误检测到grep。但是,如果第一个或最后一个字符串正确地包含两个引号,则在此阶段的开头或结尾处将会有一个额外的换行符。因此,这段代码删除了最后一行和第一行以仅匹配此场景。
  • 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

这是一种awk方法:

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

相关内容