如何使用sed和back引用在unix中打印出子串?

时间:2018-02-15 19:55:49

标签: unix sed terminal backreference

假设我有以下文件:

1.Walmart #U.S.A. 
2.SAP (Germany)

我想删除文件中的所有内容,但号码和公司名称除外。例如:之后没有美国。但我只允许使用sed和backreferences。没有别的

我尝试过类似的事情:

sed -E 's/(U.S.A.), /s(Walmart)/\2, \1/g' file.txt

输出应该如下:

1.Walmart

2.SAP

3 个答案:

答案 0 :(得分:2)

这将删除空白及其后的所有内容。

sed 's/ .*//' file

输出:

1.Walmart
2.SAP

来自man sed

  

s/regexp/replacement/:                 尝试将regexp与模式空间匹配。如果成功,请替换匹配的部分                 更换。

答案 1 :(得分:1)

反向引用解决方案

sed -E 's/(.*) (.*)/\1/g' file

但是在这样简单的正则表达式中使用反向引用太多了 你可以像Cyrus建议的那样做,或者替代:

$ grep -o '^[^ ]*' file

答案 2 :(得分:0)

s命令的语法只允许一个正则表达式和一个替换。您可以执行多次替换

s/[^A-Za-z0-9]*U\.S\.A\.[^A-Za-z0-9]*//
s/[^A-Za-z0-9]*Germany[^A-Za-z0-9]*//

或在这种情况下,当替换相同时,将它们组合成一个正则表达式:

s/[^A-Za-z0-9]*\(U\.S\.A\.\|Germany\)[^A-Za-z0-9]*//

如果您的sed支持-E,您可以删除反斜杠,但它不可移植,因此我还原为“传统”sed正则表达式语法。

[^A-Za-z0-9]*负责在比赛中包括任何周围的非患者(空格,圆括号,标点符号等)。

没有理由为此使用反向引用,当然,为了向您展示它是如何工作的,您可以在国家/地区名称之前包含所有内容并将其复制回替换名称:

sed 's/^\(.*[A-Za-z0-9]\)[^A-Za-z0-9]*\(U\.S\.A\.\|Germany\)[^A-Za-z0-9]*/\1/'

第一个右括号前的[A-Za-z0-9]锚定.*匹配,因此它不会在国家/地区名称前抓取任何空格或标点符号。