我必须在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”时,如何进行搜索/替换。 谢谢您的帮助。
答案 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
换句话说,正是您想要的。但是,再次警告:这不是任意搜索和替换的通用解决方案。如果您想要那个,那么您将需要研究\
手册,以确定哪些字符需要在正则表达式中转义,哪些字符需要在替换中转义。而且,我看不到一种方法可以仅对每个变量使用一个模式替换。