可以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)
}
}'
(D
在sed
循环中删除了模式空间的第一行)。
答案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'