我正在尝试过滤掉包含除文本文件中的字母之外的任何字符的所有单词。我查看了stackoverflow和其他网站,但我发现的所有答案都非常具体针对不同的场景,我无法为我的目的复制它们;我最近才开始学习Unix工具。
以下是我想要做的一个例子:
输入:
@derik I was there and it was awesome! !! http://url.picture.whatever #hash_tag
输出:
I was there and it was awesome!
因此带有标点符号的单词可以保留在文件中(事实上我需要它们保留)但是任何带有特殊字符的子字符串(包括标点符号)都需要被删除。这可能可以用sed完成,但我无法弄清楚正则表达式。帮助
谢谢!
答案 0 :(得分:1)
以下是使用Perl完成的方法:
perl -ane 'for $f (@F) {print "$f " if $f =~ /^([a-zA-z-\x27]+[?!;:,.]?|[\d.]+)$/} print "\n"' file
我使用此输入文本作为我的测试用例:
Hello,
How are you doing?
I'd like 2.5 cups of piping-hot coffee.
@derik I was there; it was awesome! !! http://url.picture.whatever #hash_tag
输出:
Hello,
How are you doing?
I'd like 2.5 cups of piping-hot coffee.
I was there; it was awesome!
命令行选项:
-n
循环输入文件的每一行,不要自动打印
-a
autosplit模式 - 将输入行拆分为@F数组。默认为在空格上拆分
-e
执行perl代码
perl代码将每个输入行拆分为@F数组,然后遍历每个字段$ f并决定是否打印它。
在每一行的末尾,打印换行符。
正则表达式^([a-zA-z-\x27]+[?!;:,.]?|[\d.]+)$
用于每个以空格分隔的单词
^
以
[a-zA-Z-\x27]+
一个或多个小写或大写字母或短划线或单引号(\ x27)
[?!;:,.]?
零或以下标点之一:?!;:,。
(|)
交替匹配
[\d.]+
一个或多个号码或。
$
结束
答案 1 :(得分:0)
sed -E 's/[[:space:]][^a-zA-Z0-9[:space:]][^[:space:]]*//g'
将删除以标点符号开头的任何单词。哪个会让你到中途。
[[:space:]]
是任何空格字符[^a-zA-Z0-9[:space:]]
是任何特殊字符[^[:space:]]*
是任意数量的非空白字符在没有^
而不是第一个[[:space:]]
的情况下再次执行此操作,以便在该行的开头删除相同的字词。
答案 2 :(得分:0)
您的要求根本不明确,但这可能是您想要的:
$ awk '{rec=sep=""; for (i=1;i<=NF;i++) if ($i~/^[[:alpha:]]+[[:punct:]]?$/) { rec = rec sep $i; sep=" "} print rec}' file
I was there and it was awesome!