假设我有以下文件:
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
答案 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]
锚定.*
匹配,因此它不会在国家/地区名称前抓取任何空格或标点符号。