【问题标题】:How to use variable in sed command in shell如何在shell中的sed命令中使用变量
【发布时间】:2018-09-16 09:07:50
【问题描述】:

我有以下代码

sed -i '' $line'i\
${String}\
' test.csv

line=3 和 string='"a","b","c"' 的位置。

但它没有按预期工作。它在每一行添加字符串。 它应该在第 3 行添加字符串。 如果我直接在命令中使用变量值,则相同的命令可以正常工作。

编辑:这个命令应该可以在 MacOSX 上运行。 (-i '' 符号是在 MacOSX 上覆盖文件所必需的。)

【问题讨论】:

标签: macos shell sed


【解决方案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 选项,因此可移植性仍然有限。

【讨论】:

    【解决方案2】:

    一般情况下,shell 变量用双引号括起来,sed 代码的其余部分用单引号括起来:

    sed -i '' "${line}"'i\
    '"${String}"'\
    ' test.csv
    

    【讨论】:

      猜你喜欢
      • 2017-11-09
      • 2022-01-08
      • 2015-08-10
      • 2013-10-09
      • 2012-06-24
      相关资源
      最近更新 更多