Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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
从文件中获取脚本时,sed的行为不同_Sed_Matching - Fatal编程技术网

从文件中获取脚本时,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对您的正则表达式做了什么。