Linux 忽略SED中的空格、制表符和新行

Linux 忽略SED中的空格、制表符和新行,linux,bash,sed,Linux,Bash,Sed,我试图替换包含制表符和换行符的文件中的字符串。 shell文件中的命令如下所示: FILE="/Somewhere" STRING_OLD="line 1[ \t\r\n]*line 2" sed -i 's/'"$STRING_OLD"'/'"$STRING_NEW"'/' $FILE 如果我手动删除换行符和制表符并只留下空格,那么我可以成功地替换文件。但是如果我留下换行符,那么SED将无法找到$STRING_OLD,也无法替换为新字符串 提前谢谢 Kobised一次读取一行,通常在读取行时

我试图替换包含制表符和换行符的文件中的字符串。 shell文件中的命令如下所示:

FILE="/Somewhere"
STRING_OLD="line 1[ \t\r\n]*line 2"
sed -i 's/'"$STRING_OLD"'/'"$STRING_NEW"'/' $FILE
如果我手动删除换行符和制表符并只留下空格,那么我可以成功地替换文件。但是如果我留下换行符,那么SED将无法找到$STRING_OLD,也无法替换为新字符串

提前谢谢

Kobi

sed一次读取一行,通常在读取行时也会一次处理一行。然而,sed确实具有读取附加行和对组合结果进行操作的设施。有几种方法可用于解决您的问题,例如:

FILE="/Somewhere"
STRING_OLD="line 1[ \t\r\n]*line 2"
sed -n "1h;2,\$H;\${g;s/$STRING_OLD/$STRING_NEW/g;p}"
这或多或少地完成了您描述的手动操作:它连接文件的所有行,但保留换行符,然后在整个缓冲区上同时执行替换。但是,这确实假设文件很短,如果文件总长度超过8192字节,POSIX不要求它工作,或者您使用的sed没有缓冲区大小限制,例如GNU sed。既然你给Linux加了标签,我想GNU-sed是可以假设的

详细内容:

n选项关闭行回显,因为我们保存了所有内容,并在最后一块打印修改后的文本。 有多个sed命令,用分号分隔,并为shell转义了文字$字符: 1h:处理输入的第一行时,用模式空间的内容(即第一行,不包括换行符)替换保留空间 2,\$H:处理从第二行到最后一行的任何行时,在保留空间中添加一个换行符,然后添加模式空间的内容 \${g;s/$STRING_OLD/$STRING_NEW/g;p}:处理最后一行时,执行以下命令组:将保留空间复制到模式空间;在全球范围内执行替换;打印图案空间的结果内容。
这是一种更简单的方法,但如果您需要容纳在缓冲区容量方面不如GNU的SED,那么还有其他方法。不过,这些问题开始变得难看。

问题的详细信息表明,您最多需要在整个文件中执行一次替换。这确实是你需要的吗?你的文件有多大?队伍能排多长?既然您使用的是Linus,那么假设GNU sed的解决方案是可以接受的,还是您需要一个只依赖POSIX sed特性的解决方案?你的问题应该包括简明的、可测试的样本输入和预期的输出,或者最多你会得到你想要的,而不是你真正需要的。旧的但很好!!!