2016-11-09 57 views
2

我有这种形式的文本数据中提取字符串:使用sed来从文本文件

^Well/Well[ADV]+ADV ^John/John[N]+N ^has/have[V]+V+3sg+PRES ^a/a[ART] 
^quite/quite[ADV]+ADV ^different/different[ADJ]+ADJ ^not/not[PART] 
^necessarily/necessarily[ADV]+ADV ^more/more[ADV]+ADV 
^elaborated/elaborate[V]+V+PPART ^theology/theology[N]+N *edu$ 

而且我希望它被加工成这种形式:

Well John have a quite different not necessarily more elaborate theology 

基本上,我需要每字符串起始字符/和结束字符[之间的字符串。

这里是我试过,但我只是得到空文件...

#!/bin/bash 

for file in probe/*.txt 

do sed '///,/[/d' $file > $file.aa 

mv $file.aa $file 

done 
+0

尝试转义您的开始字符:'///' - >'/ \ //' –

+0

仍然会给我空文件:/ – Jakob

回答

4

awk来救援!

$ awk -F/ -v RS=^ -v ORS=' ' '{print $1}' file 

Well John has a quite different not necessarily more elaborated theology 

说明组记录分隔符(RS)到^来分离的逻辑组,还设置字段分隔符(FS),以/和打印第一字段作为您的要求。最后,将输出字段分隔符(OFS)设置为空格(而不是默认的新行)将提取的字段保留在同一行上。

+0

是的,这很有用,谢谢! !如果你能向我解释不同的论点意味着什么,我会非常感激! – Jakob

-1
cat file|grep -oE "\/[^\[]*\[" |sed -e 's#^/##' -e 's/\[$//' | tr -s "\n" " " 
+1

虽然此代码段可能会解决问题,但并不能解释它为什么或如何回答这个问题。请[请提供您的代码解释](// meta.stackexchange.com/q/114762/269535),因为这确实有助于提高帖子的质量。请记住,您将来会为读者回答问题,而这些人可能不知道您的代码建议的原因。 **举报人/评论者:** [仅限代码解答,例如这个,downvote,不要删除!](// meta.stackoverflow.com/a/260413/2747593) –

2

随着GNU的grep和Perl兼容的正则表达式(-P):

$ echo $(grep -Po '(?<=/)[^[]*' infile) 
Well John have a quite different not necessarily more elaborate theology 

-o保留只是比赛,(?<=/)为正向后看(“确保有一个/,但不包括它在比赛中“),并且[^[]*是”除[以外的字符序列“。

grep -Po每行打印一个匹配;通过使用grep的输出作为echo的参数,我们将换行符转换为空格(也可以通过管道连接到tr '\n' ' ')。

+0

错字...应该是''(?<= /)[^ [] *''..一个额外的''/''在开始处留下..也可以使用''/ \ K [^ [] *' ' – Sundeep

+1

@sundeep我起初是'\ K',那是'''''''''''谢谢! –