sed命令:搜索并用\ n字符替换变量

时间:2018-06-26 21:18:04

标签: bash search sed replace newline

我必须在bash脚本中变量:

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

每个变量都包含“ \ n”字符,如何使用sed搜索和替换:

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

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

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

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

1 个答案:

答案 0 :(得分:1)

似乎您正在尝试匹配两个字符序列self.obtenerZafra = function () { var url = pathApi + "apizafra/getzafraactivo"; $.getJSON(url) .done(function (data) { // var idZafraAct = 0; if (data["estatus"]) { // On success, 'data' contains a list of products. self.listaZafra(data["resultado"]); $("#IDZafra").val(item.IDZafra).trigger("change"); } else { mostrarToastr(data["mensaje"], "E"); } }).fail(function (d) { enableBottonForm(); mostrarToastr(d.responseText, "E"); }); } ,而不是在某些情况下它们一起代表单个换行符。两者之间有很大的区别。

作为示例的一部分,您展示了

\n

,但这根本不起作用,因为变量引用不会在单引号内扩展。这与外壳变量sed 's/$string/$line/g' file.txt string的值无关。

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

line

[已删除多余的空格。]

当然,您要关注的问题是$string="The cat is green.\n" $line="Sunny day today.\n" sed识别为换行符的代码,但是您还遇到了一个问题,即在正则表达式中,{{1 }}字符与 any 字符匹配,因此,如果您希望将其视为文字,则也必须对其进行转义(在模式中,而不是在替换中)。如果您尝试支持搜索并替换任意文本,那么还需要转义其他字符。

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

.

\n形式的参数扩展对扩展后的值执行模式替换,但请注意,模式(sed "s/${string//\\n/\\\\n}/${line//\\n/\\\\n}/g" )是根据Shell Globing规则而不是正则表达式解释的。特定的形式取代了图案的所有外观;请阅读bash手册,了解仅与首次出现和/或仅在参数值的开头或结尾匹配的替代项。还要注意,${foo//pat/repl}字符在模式替换中的额外加倍-它们也需要在shell中转义。

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

pat

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