单线cmd sed Mac OSX el capitan

时间:2017-01-15 20:50:31

标签: bash macos sed

我尝试单行以下工作命令在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} /

我相信我错过了一些关于如何使用分号的内容..

1 个答案:

答案 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"