Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 单线cmd sed Mac OSX el capitan_Bash_Macos_Sed - Fatal编程技术网

Bash 单线cmd sed Mac OSX el capitan

Bash 单线cmd sed Mac OSX el capitan,bash,macos,sed,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的输出,即预期结果: 123456789112889667 这两者都不是: LANG=C sed -E 's/$/\\z/; :while; s/([0-9

我正在尝试单行以下工作命令以在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的输出,即预期结果:

123456789112889667

这两者都不是:

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}的多个实例/


我相信我遗漏了一些关于如何使用分号的知识

sed仅用于在单个行上进行简单替换。您试图做的并不是这样,所以您不应该尝试使用sed来完成它。不清楚您想做什么,但这是:

$ awk -v RS='\\s+' 'NF{print "\"" $0 "\""}' file
"123456"
"789112"
"889667"
它使用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"

出现了什么错误?两者都显示文件的一行,而不是模式/[0-9]{6}/的多个实例。在帖子中错过了这一点,谢谢;你能提供示例输入和输出吗?Mac OS X意味着旧的BSD sed,所以关于标签名称的奇怪规则-分号不能结束它们。试试LANG=C sed-E-E的/$/\\z/;:而'-e's/[0-9]{6}.*\\z.*/\2\1/;t当'-e's/*\\z//'myfile.txt时,我会测试它,但我手头没有BSD。标签以文字换行符终止,因此第一个标签是:while之后的所有内容。您可以在:while和:twile之后插入换行符,例如:while“$”\ns/…,但这是一种bashism。我认为使用多个-e标志更干净。非常感谢您的帮助。我的文件是一行,看起来像123456\r\n\r\n 789112\r\n 889667。我从awk开始,但找不到正确的方法,所以我尝试了sed。。。但似乎我在sed和awk之间使用什么工具的问题上是错误的…但根据定义,如果它包含\r\n,则不是一行,因为在Windows和UNIX上,行都以\r\n结尾,因此无论哪种方式,都会出现新行。除非您的意思是它字面上包含4个字符反斜杠r反斜杠n。该行是对服务器的curl请求的回答,服务器响应的是一个json,其中包含\r\n值,这很愚蠢。。。但是我没有任何控制权,我只是尝试解析答案…这很好,但是如果它包含任何Windows或UNIX定义的\r\n行,它就不是一行。是的,对不起,我不是有意让您混淆。。。非常感谢你的帮助:!