变量仅在不加引号(不推荐)或用双引号括起来时才会展开;它们不会在单引号内展开。
当只有一两个反斜杠要转义时,将整个字符串放在双引号内,将反斜杠加倍,这不是不合理的。如果你有任何反引号,你也需要避开它们。如果您有多个反斜杠或有反引号,则使用单引号通常是您的最佳选择。
给定一个数据文件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 选项,因此可移植性仍然有限。