如何在shell中的sed命令中使用变量

时间:2018-04-06 10:47:49

标签: macos shell sed

我有以下代码

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上的文件所必需的。)

2 个答案:

答案 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选项。