使用变量进行行号限制的Sed

时间:2014-04-30 23:04:18

标签: bash sed

我想在具有特定行号的行上进行搜索和替换。但是,我希望能够为行号本身使用变量。

例如,如果我想在第180行用数字5替换数字4,我会使用以下代码。

sed '180 s/4/5/' file

我的问题是如何使用变量作为行号?

sed '$variable s/4/5/' file

3 个答案:

答案 0 :(得分:3)

@ gniourf_gniourf的评论包含关键指针:在sed程序周围使用 double 引号以引用 shell 变量(shell不会& #39;以任何方式解释(扩展)单个 - 引用的字符串。)

请注意 sed程序是他们自己的世界 - 他们有 NO变量概念,所以使用变量的唯一方法是使用由 shell 评估的双引号字符串,包含对 shell变量的引用

因此,您必须\ - 转义您希望shell忽略并转移到sed以查看的字符,特别是$ as \$

但是,在您的具体情况下,没有什么需要逃避。 因此,正如@gniourf_gniourf在其评论中所述,使用:

sed "$variable s/4/5/" file

有感:

或者,sed程序的核心可以保持单引号,只有 shell-variable引用拼接在中为引用字符串;请注意,字符串组件之间允许无空格,因为整个表达式必须求值为单个字符串:

sed "$variable"' s/4/5/' file

虽然在这种特殊情况下你可以在变量引用周围没有双引号的情况下离开,但是使用它们通常更安全,以避免不必要的shell扩展(例如分词)可能会改变甚至打破命令。

答案 1 :(得分:1)

您可以将变量留在引号之外

sed $variable's/4/5/' file

请注意,变量和开头引号之间不能有空格

答案 2 :(得分:0)

您可以使用awk

执行此操作
awk 'NR==l {sub(/4/,"5")}1' l="$variable" file