我尝试单行以下工作命令在bash中运行它:
LANG=C sed -E '
s/$/\\z/
:while
s/([0-9]{6})(.*\\z.*)/\2 "\1"/
twhile
s/.*\\z//' myfile.txt
myfile.txt示例:
123456 \ r \ n \ r \ n 789112 \ r \ n 889667
输出上面的cmd(这是预期的结果):
" 123456" " 789112" " 889667"
这两个:
LANG=C sed -E 's/$/\\z/; :while; s/([0-9]{6})(.*\\z.*)/\2 "\1"/; twhile; s/.*\\z//' myfile.txt
输出:
123456 \ r \ n \ r \ n 789112 \ r \ n 889667 \ z
或者这实际上有效:
LANG=C sed -E 's/$/\\z/' -E :while -E 's/([0-9]{6})(.*\\z.*)/\2 "\1"/;twhile' -E 's/.*\\z//' myfile.txt
输出:
sed:-E:没有这样的文件或目录
sed :: while:没有这样的文件或目录
sed:-E:没有这样的文件或目录
sed:s /([0-9] {6})(。 \ z。)/ \ 2" \ 1" /; twhile:没有这样的文件或目录
sed:-E:没有这样的文件或目录
sed:s /.* \ z //:没有这样的文件或目录
123456 \ r \ n \ r \ n 789112 \ r \ n 889667 \ z
因此,两者都显示文件的唯一一行而不是多个模式实例/ [0-9] {6} /
我相信我错过了一些关于如何使用分号的内容..
答案 0 :(得分:1)
sed用于单个行上的简单替换,即全部。你要做的不是这样,所以你不应该尝试使用sed来做到这一点。目前尚不清楚你想要做什么,但就是这样:
$ awk -v RS='\\s+' 'NF{print "\"" $0 "\""}' file
"123456"
"789112"
"889667"
对于多字符RS使用GNU awk,对\s
使用[[:space:]]
简写。以上内容在此输入文件上运行:
$ cat -v file
123456 ^M
^M
789112 ^M
889667
我认为你试图用你发布的样本输入表达的是:
$ printf '123456 \r\n \r\n 789112 \r\n 889667' |
awk -v RS='\\s+' 'NF{print "\"" $0 "\""}'
"123456"
"789112"
"889667"
或者如果您更喜欢寻找匹配的字符串而不是分隔字符串的空格:
$ printf '123456 \r\n \r\n 789112 \r\n 889667' |
awk -v RS='[0-9]{6}' '{print "\"" RT "\""}'
"123456"
"789112"
"889667"