gpt4 book ai didi

linux - 忽略 SED 中的空格、制表符和换行符

转载 作者:太空宇宙 更新时间:2023-11-04 04:45:45 31 4
gpt4 key购买 nike

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

FILE="/Somewhere"
STRING_OLD="line 1[ \t\r\n]*line 2"
sed -i 's/'"$STRING_OLD"'/'"$STRING_NEW"'/' $FILE

如果我手动删除换行符和制表符并仅保留空格,那么我可以成功替换该文件。但如果我保留换行符,则 SED 无法找到 $STRING_OLD 并且无法替换为新字符串

提前致谢

科比

最佳答案

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:处理第一行输入时,将“hold space”替换为模式空间的内容(即第一行,不包括换行符)
    • 2,\$H:处理从第二行到最后一行的任何行时,将换行符附加到保留空间,然后是模式空间的内容
    • \${g;s/$STRING_OLD/$STRING_NEW/g;p}:处理最后一行时,执行这组命令:将保持空间复制到模式空间;全局执行替换;打印模式空间的结果内容。

这是一种更简单的方法,但是如果您需要适应在缓冲区容量方面不如 GNU 的 sed,那么还有其他方法可以实现。不过,这些开始变得丑陋。

关于linux - 忽略 SED 中的空格、制表符和换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37994626/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com