2015-09-20 53 views
1

我试图从文本文件中滤除包含除字母之外的任何字符的所有单词。我已经浏览了stackoverflow和其他网站,但是我发现的所有答案都是针对不同场景的,而且我无法将其复制到我的目的中;我最近才开始学习Unix工具。摆脱文本文件中包含特殊字符的所有单词

这里是我想要做的一个例子:

输入:

@derik I was there and it was awesome! !! http://url.picture.whatever #hash_tag 

输出:

I was there and it was awesome! 

所以标点符号的话可以留在文件中(其实我需要他们留下来),但任何具有特殊字符(包括标点符号)的子字符串都需要修剪掉。这可能可以用sed完成,但我无法弄清楚正则表达式。帮帮我。

谢谢!

+1

你有'punctuation'字符不属于名单中删除? – anubhava

+1

*特殊字符*是什么意思? – melpomene

回答

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! 
+1

这确实是我想要的。谢谢! – Novice

0

sed -E 's/[[:space:]][^a-zA-Z0-9[:space:]][^[:space:]]*//g'将摆脱任何以标点符号开头的单词。这会让你在中途停下来。

  • [[:space:]]是任何空白字符
  • [^a-zA-Z0-9[:space:]]任何特殊字符
  • [^[:space:]]*被任意数量的非空白字符

再做一次没有^,而不是第一[[:space:]]得到去除在行首开始的那些词。

+0

您应该用'[:alnum:]'替换'a-zA-Z0-9',以便在使用字符类时保持一致。 –

+0

感谢您的回复,但命令并不完全符合我需要做的。我可能不太清楚这个问题,所以这里是我正在寻找的: 在开始或中间修剪出包含特殊字符(我的意思是任何不是字母的字符)的子字符串。 保留带有标点符号的文字,例如“你好”, 在末尾修饰除了标点符号之外的特殊字符的子字符串,如“HA%” 再次感谢您的帮助! – Novice

+1

呼叫良好。谢谢@EdMorton – jazzabeanie

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自动分割模式 - 拆分输入线到@F阵列。默认为分裂的空白

  • -e执行Perl代码

Perl代码将每个输入行到@F数组,然后遍历每场$ F,并决定是否要打印。
在每行的末尾,打印换行符。

正则表达式^([a-zA-z-\x27]+[?!;:,.]?|[\d.]+)$对每个空格分隔单词使用

  • ^开始于

  • [a-zA-Z-\x27]+一个或多个小写或大写字母或破折号或单引号(\ X27)

  • [?!;:,.]?零或下列其中一个标点符号:?!;:,。

  • (|)交替匹配

  • [\d.]+一个或多个数字或。

  • $结束

相关问题