
..という名前の下に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"
答え2
3行目の後に行を追加してから3行目を新しい4行に関連付けると、ed
引用符や正規表現の区切り文字に関する問題を回避できます。例えば
printf "%s\n" 3a " $ruledeck" . 3,4j wq | ed -s DRC.txt
printf "%s\n"
残りの引数のそれぞれをed
一度に1つずつテキストエディタにパイプするために使用されます。
ex
or vi -e
(vim -e
またはvim -E
)を代わりに使用できますed
。ただしex
、さまざまな実装では、行を連結するときにスペースを挿入しますが、whileはそうではありません(したがって、引用符付き文字列の先頭にスペースを追加する必要はありません)。そのプログラムと他の関連プログラムは同じ基本的な編集コマンドを実装していますが、いくつかの主な微妙な違いがあります。vi
ed
" $ruledeck"
sed
qed1965. 一部は、これらのコマンドの重要な拡張も提供しています。