考虑下面显示的文件,其名称为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
,一次一个。
ex
or vi -e
(或vim -e
或vim -E
) 可以用来代替ed
- 但请注意,在连接行时插入空格ex
的各种实现,而 while 则不然(因此不需要在带引号的字符串开头添加空格)。它们以及其他相关程序都实现相同的基本编辑命令,但有一些主要的细微差别,这些差别起源于vi
ed
" $ruledeck"
sed
qed1965 年。有些还对这些命令进行了重大扩展。