替换给定行号的单词

替换给定行号的单词

我有一个文件1.txt

INTEGER-d_int ()
INTEGER-d_int  ()
INTEGER-d_int       (    )
INTEGER-d_intClass()
INTEGER-d_intClass     new()

我想用 替换第 1 行和第 5 行d_int的。d_INT

就我而言,这些行号位于变量中。

答案1

将变量 a 和 b 设置为您想要进行替换的行,然后运行 ​​awk:

a=1; b=5; awk '{ if (NR=='"$a"' || NR=='"$b"') sub("d_int","d_INT",$0); print $0}' 1.txt

在上面的代码中,awk 检查我们是否位于第 行号$a或第 行号$b。 如果是,则执行替换。

使用技巧的一部分awk是保护awk命令不受 shell 的影响。为此,awk除了我们明确希望 shell 替换$a和 的地方外,所有命令都放在单引号中$b$a并且$b每个命令都放在双引号中。

在您的示例中1.txt,上述内容产生:

INTEGER-d_INT ()
INTEGER-d_int  ()
INTEGER-d_int       (    )
INTEGER-d_intClass()
INTEGER-d_INTClass     new()

替代方法

sed也可以用于此目的。仅更改第 1 行的 sed 命令是1 s/d_int/d_INT/sed仅更改第 5 行的命令是5 s/d_int/d_INT/。因此,使用 shell 替换,对行和sed进行替换的程序是:ab

a=1; b=5; s='s/d_int/d_INT/' ; sed "$a $s; $b $s" 1.txt

扩展到任意行数

假设我们得到一个lines要应用替换的任意列表:

lines="1 5 6 9 15 19 20"
s='s/d_int/d_INT/'
for line in $lines
do
    echo line=$line
    cmd="$line $s; $cmd"
done
echo cmd=$cmd
sed "$cmd" 1.txt

答案2

sed -i '1,5s/d_int/d_INT/' 1.txt

相关内容