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の3行目の末尾にパスであるこの変数の値を追加する必要があります。を使用してこれを試しましたが、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

これには2つの問題があります。まず、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"

おすすめ記事