shell 如何通过传递行号作为变量来删除一行?

yizd12fk  于 2023-04-12  发布在  Shell
关注(0)|答案(2)|浏览(158)

我想通过将数字作为变量传递来删除文档中的一行,如下所示:

ERR=`set of bash commands` ;  sed '${ERR}d' file

但是上面单引号中的sed命令不起作用。那么如何实现这个任务呢?

axr492tv

axr492tv1#

对于给定的文件,如

$ cat file
1
2
3
4
5
6
7
8
9
10

和包含行号的变量,如

$ ERR=5

使用sed

使用双引号以允许变量进行插值。注意使用大括号以允许sed区分变量和d标志。在输出行号5中不再是打印机。

$ sed "${ERR}d" file
1
2
3
4
6
7
8
9
10

使用awk

NR存储给定文件的行号。使用-v选项将shell变量传递给awk,我们创建了一个名为noawk变量。使用NR不等于awk变量的条件,我们告诉awk打印除了我们不想打印的行号之外的所有内容。

$ awk -v no="$ERR" 'NR!=no' file
1
2
3
4
6
7
8
9
10
pes8fvy9

pes8fvy92#

这是很好的(好,坏和丑陋-克林特伊斯特伍德,李货车克里夫和伊莱沃勒克):

good='1680790311' #the Good;
bad=2 #the Bad;
ugly=1 #the Ugly;
deleteYesExists=$(grep -n "$good" userdb.tmp | cut -d':' -f1);
if [[ $deleteYesExists > 0 ]];then sed -i "$deleteYesExists"d userdb.tmp;fi

还有:

if [[ $(grep -n "$good" userdb.tmp | cut -d':' -f1) = "$ugly" ]];then sed -i "$bad"d userdb.tmp;fi

相关问题