使用变量限制行号的Sed操作

3
我想对特定行号的一行进行搜索和替换。但是,我希望能够使用一个变量来代替行号本身。
例如,如果我想在第180行将数字4替换为数字5。我会使用以下代码。
sed '180 s/4/5/' file

我的问题是如何使用变量来表示行号?
sed '$variable s/4/5/' file

4
与您所做的相同,但使用双引号:sed "$variable s/4/5/" file - gniourf_gniourf
3个回答

3
@gniourf_gniourf的评论包含了重要提示:在sed程序中使用双引号以引用shell变量(因为单引号字符串不会被shell解释(扩展))。
请注意,sed程序是一个独立的世界 - 它们没有变量概念,因此使用变量的唯一方法是使用由shell求值的包含对shell变量的引用的双引号字符串
因此,您必须\-转义要让shell忽略并传递给sed查看的字符,特别是将$作为\$
但在您的特定情况下,无需转义任何内容。 因此,如@ gniourf_gniourf在他的评论中所述,请使用:
sed "$variable s/4/5/" file

补充说明:

作为替代方案,你的sed程序的核心可以保持单引号,只需要将shell变量引用作为双引号字符串拼接在其中;请注意,在字符串组成部分之间不能有空格,因为整个表达式必须计算为单一字符串:

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

在这种情况下,你可以不使用变量引用周围的双引号,但通常最好使用它们,以避免意外的shell扩展(例如单词拆分)可能会改变或甚至破坏命令。


1
你可以将变量放在引号外面。
sed $variable's/4/5/' file

请注意,变量和起始引号之间不能有空格。

0

你可以使用 awk 来完成它。

awk 'NR==l {sub(/4/,"5")}1' l="$variable" file

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接