从文件中获取脚本时,sed的行为不同
我需要从文件中提取可能包含从文件中获取脚本时,sed的行为不同,sed,matching,Sed,Matching,我需要从文件中提取可能包含\n序列的字符串。 请注意,在本例中,\n不是换行符,只是两个字符的序列:反斜杠后跟小写的n 例如,如果我键入: echo garbage "useful \n string" garbage | sed -e s/.*\(\"[^\"]*\"\).*/\1/ 结果是正确的: "useful \n string" 如果相反,我将sed命令保存到文件(b.txt)并键入: echo garbage "useful \n string" garbage | sed
\n
序列的字符串。请注意,在本例中,
\n
不是换行符,只是两个字符的序列:反斜杠后跟小写的n
例如,如果我键入:
echo garbage "useful \n string" garbage | sed -e s/.*\(\"[^\"]*\"\).*/\1/
结果是正确的:
"useful \n string"
如果相反,我将sed命令保存到文件(b.txt
)并键入:
echo garbage "useful \n string" garbage | sed -f b.txt
这应该做同样的事情,相反,我没有看到任何匹配,结果是:
garbage "useful \n string" garbage
请注意,该文件仅包含sed
命令;输入字符串仍然来自stdin
我正在Windows 10命令行窗口中使用GNU sed版本4.2.1。有什么建议吗?您的引用和转义序列看起来可疑,请尝试以下操作:
$ echo 'garbage "useful \n string" garbage' | sed 's/.*\("[^"]*"\).*/\1/'
"useful \n string"
$ cat b.txt
s/.*\("[^"]*"\).*/\1/
$ echo 'garbage "useful \n string" garbage' | sed -f b.txt
"useful \n string"
正确使用配对'
和'
,并在gnu中使用-E
而不是-E
选项
$ echo 'garbage "useful \n string" garbage' | sed -E 's/.*("[^"]*").*/\1/'
"useful \n string"
$ cat b.txt
s/.*("[^"]*").*/\1/
$ echo 'garbage "useful \n string" garbage' | sed -Ef b.txt
"useful \n string"
为了澄清这种奇怪的行为,我需要补充一点,如果我从字符串中删除\n序列,那么即使命令来自文件,一切都可以正常工作。看起来,反斜杠的存在导致了Unix上的差异,我鼓励您在命令行中将命令括在单引号中,这可能会使您丢失一些反斜杠(特别是双引号前面的反斜杠)。我不确定您在Windows上使用的是哪个shell,以及它如何处理(破坏)命令。一种测试方法可能是
echo s/*\(\“[^\”]*\”)./\1/
来显示sed
看到的内容。在该文件中,我认为您应该删除双引号之前的反斜杠。在命令行上处理正则表达式的一个棘手部分是理解shell对您的正则表达式做了什么。