![替换给定行号的单词](https://linux22.com/image/1398345/%E6%9B%BF%E6%8D%A2%E7%BB%99%E5%AE%9A%E8%A1%8C%E5%8F%B7%E7%9A%84%E5%8D%95%E8%AF%8D.png)
我有一个文件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
进行替换的程序是:a
b
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