如何在第3行末尾插入路径

如何在第3行末尾插入路径

考虑下面显示的文件,其名称为DRC.txt.该文件的内容是:

#############Actions#################
set a [project $p get_action ICV_DRC]
action $a set_parameter "ruledeck"
action $a set_parameter "options"

现在我有一个名为 的变量ruledeck = /praj/test/drc_tsn/test1。我需要附加这个变量的值,它是 DRC.txt 第三行末尾的路径。我试图使用 来做到这一点sed,但路径没有添加,只有变量是。我该如何解决上述问题?

sed -i -e '3s/$/"$ruledeck"/' DRC.txt

该命令给出的输出如下所示:

#############Actions#################
set a [project $p get_action ICV_DRC]
action $a set_parameter "ruledeck" $ruledeck
action $a set_parameter "options"

我想要这样的输出:

#############Actions#################
set a [project $p get_action ICV_DRC]
action $a set_parameter "ruledeck" /praj/test/drc_tsn/test1
action $a set_parameter "options"

答案1

这里有两个问题。首先,您的sed命令位于单引号 ( '') 中,因此变量不会扩展:

$ echo $ruledeck 
/praj/test/drc_tsn/test1
$ echo '$ruledeck'
$ruledeck

我看到您已将变量放在sed命令中的双引号中,但这不会改变任何内容,因为整个内容都是单引号的。您需要用双引号代替:

sed -e "3s/$/$ruledeck/" file

然而,这也会打破:

$ sed -e "3s/$/$ruledeck/" file
sed: -e expression #1, char 8: unknown option to `s'

这是因为您的变量包含/,但您还使用它/作为替换运算符 ( s///) 的分隔符。您需要一个不同的分隔符。这应该做你想要的:

$ sed -e "3s|$|$ruledeck|" file
#############Actions#################
set a [project $p get_action ICV_DRC]
action $a set_parameter "ruledeck"/praj/test/drc_tsn/test1
action $a set_parameter "options"

但如果该行末尾没有空格,这仍然不太正确。要添加空格,但前提是该空格尚不存在,请使用\?(空格和转义问号)来匹配“0 或 1 个空格”。将所有这些放在一起得出:

$ sed -e "3s| \?$| $ruledeck|" file
#############Actions#################
set a [project $p get_action ICV_DRC]
action $a set_parameter "ruledeck" /praj/test/drc_tsn/test1
action $a set_parameter "options"

答案2

您可以通过在ed第 3 行之后追加一行,然后连接第 3 行和新的第 4 行来避免引用和正则表达式分隔符出现任何问题。例如

printf "%s\n" 3a " $ruledeck" . 3,4j  wq | ed -s DRC.txt

printf "%s\n"用于将其剩余的每个参数通过管道传输到文本编辑器ed,一次一个。

exor vi -e(或vim -evim -E) 可以用来代替ed- 但请注意,在连接行时插入空格ex的各种实现,而 while 则不然(因此不需要在带引号的字符串开头添加空格)。它们以及其他相关程序都实现相同的基本编辑命令,但有一些主要的细微差别,这些差别起源于vied" $ruledeck"sedqed1965 年。有些还对这些命令进行了重大扩展。

相关内容