我有以下代码
app.controller(mainController, ['$scope', '$http', function ($scope, $http) {
$scope.getDrawing = function ()
{
$http.get('/get_drawing').success(function(data){
console.log(data);
}).error(function(err){console.log(err);});
}
$scope.getDrawing();
}]);
})();
其中sed -i '' $line'i\
${String}\
' test.csv
和line=3
。
但它并没有像预期的那样发挥作用。它在每个备用行上添加字符串。 它应该在第3行添加字符串。 如果我在命令中直接使用变量值,则相同的命令可以正常工作。
编辑:此命令应适用于MacOSX。 (string='"a","b","c"'
表示法是覆盖MacOSX上的文件所必需的。)
答案 0 :(得分:1)
通常,将shell变量放在双引号中,并将sed
代码的其余部分保留在单引号中:
sed -i '' "${line}"'i\
'"${String}"'\
' test.csv
答案 1 :(得分:1)
变量仅在不引用(不推荐)或用双引号括起时展开;它们不会在单引号内扩展。
当只有一个或两个反斜杠被转义时,将整个字符串放在双引号内,使反斜杠加倍是不合理的。如果你有任何反引号,你也需要逃避它们。如果您有多个反斜杠或者您有后引号,那么使用单引号通常会成为您更好的选择。
给定一个包含以下内容的数据文件test.csv
bizarre,multiple,words
plain,simple,words
catastrophic,failure,of,imagination
pejorative,interjections,ignored
abelone,abyssinia,ablation
pokemon,harry,potter
因此,您可以实现所需的效果:
$ line=3
$ string='"a","b","c"'
$ sed "${line}i\\
> ${string}
> " test.csv
bizarre,multiple,words
plain,simple,words
"a","b","c"
catastrophic,failure,of,imagination
pejorative,interjections,ignored
abelone,abyssinia,ablation
pokemon,harry,potter
$
需要${string}
之后的换行符。
奇怪的是,您还可以在${string}
之后添加一个或两个反斜杠并获得相同的结果。或者,您可以用单引号引用命令的选定部分,确保变量不是单引号,而是双引号:
$ sed "${line}"'i\
> '"$string"'
> ' test.csv
bizarre,multiple,words
plain,simple,words
"a","b","c"
catastrophic,failure,of,imagination
pejorative,interjections,ignored
abelone,abyssinia,ablation
pokemon,harry,potter
$
我没有使用-i ''
选项覆盖文件(创建'备份'没有任何扩展名),以便在标准输出 - 终端上看到输出。您可以在macOS上添加这些选项以覆盖该文件。 Linux上的相应表示法(GNU sed
)只是-i
选项。您可以在两个平台上使用-i.bak
来创建扩展名为.bak
的备份;在Linux上,-i
和.bak
之间不能有空格,但macOS上允许空格。因此-i.bak
是唯一的便携式表示法,它创建了备份 - 并且可移植性仍然有限,因为其他Unix变体可能根本不支持-i
选项。