【问题标题】:sed command: search and replace variables with \n charactersed 命令:使用 \n 字符搜索和替换变量
【发布时间】:2018-12-05 16:23:42
【问题描述】:

我必须在 bash 脚本中添加变量:

    $string = "The cat is green.\n"
    $line = "Sunny day today.\n"

这些变量中的每一个都包含“\n”字符,我如何使用 sed 进行搜索和替换:

    sed 's/$string/$line/g' file.txt

这似乎不起作用,如果我从字符串中删除“\n” sed 可以正常工作。 如果我只有文本,我可以通过添加反斜杠来转义“\n”:

    sed 's/"The cat is green.\\n"/"Sunny day today.\\n"/g' file.txt

当变量中包含“\n”时,我该如何进行搜索/替换。 谢谢你的帮助。

【问题讨论】:

  • 你能显示file.txt的确切格式吗? sed 一次读取一行,可以进行多行匹配,但它对保留空间的使用很繁琐。顺便说一句,在's/$string/$line/g' 周围使用单引号意味着变量不会被替换,它会寻找文字$string

标签: bash search sed replace newline


【解决方案1】:

您似乎正在尝试匹配 两个字符 序列 \n,而不是它们在某些上下文中一起表示的单个换行符。它们之间有很大的不同。

作为示例的一部分,您提出了

sed 's/$string/$line/g' file.txt

,但这根本不起作用,因为变量引用不会在单引号字符串中展开。这与 shell 变量 stringline 的值无关。

但让我们考虑一下这些值:

$string="The cat is green.\n"
$line="Sunny day today.\n"

[删除多余的空格。]

当然,您关注的问题是 sed\n 识别为换行符的代码,但您也有问题,在正则表达式中,. 字符匹配 any 字符,因此如果您希望它被视为文字,那么它也需要被转义(在模式中,而不是在替换中)。如果您尝试支持任意文本的搜索和替换,那么您还需要转义其他字符。

回答提出的问题(仅转义 \n 序列)您可以这样做:

sed "s/${string//\\n/\\\\n}/${line//\\n/\\\\n}/g"

${foo//pat/repl} 形式的参数扩展对扩展值执行模式替换,但请注意,模式 (pat) 是根据 shell 通配规则解释的,而不是作为正则表达式。这种特定的形式取代了图案的每一个外观;阅读 bash 手册以获取仅匹配第一次出现和/或仅匹配参数值的开头或结尾的替代方案。另请注意,模式替换中 \ 字符的额外加倍——它们也需要为 shell 进行转义。

鉴于您的变量定义,该命令将等同于:

sed 's/The cat is green.\\n/Sunny day today.\\n/g'

换句话说,正是您想要的。但是,再次警告:这不是任意搜索和替换的通用解决方案。如果您想要那个,那么您需要研究sed 手册以确定哪些字符需要在正则表达式中转义,哪些需要在替换中转义。此外,我没有看到一种方法可以只对每个变量进行一个模式替换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 2023-01-02
    • 2021-05-16
    • 2014-09-24
    相关资源
    最近更新 更多