任意の文字列に設定しますfoo
。ファイルから次のすべての項目を検索する必要があります。
\LeftLabel{foo}
各項目を次に置き換えます。
\LeftLabel{\textsf{foo}}
$
ただし、fooが文字で始まらない場合にのみ適用されます。どのように?
答え1
このテストファイルを考えてみましょう。
$ cat file
\LeftLabel{foo}
\LeftLabel{$foo}
LeftLabel{foo}
それでは、代替をしましょう。
$ sed -E 's|\\LeftLabel\{([^$}][^}]*)\}|\\LeftLabel{\\textsf{\1}}|g' file
\LeftLabel{\textsf{foo}}
\LeftLabel{$foo}
LeftLabel{foo}
どのように動作しますか?
の置換コマンドは、whereが正規表現でその場所で置き換えられているように見えます。最後のsed
コマンドはsedに最初の行だけでなく、行内のすべての項目を置き換えるように指示します。s|old|new|g
old
new
g
私たちのコマンドでは、そのold
部分は次のとおりです。
\\LeftLabel\{([^$}][^}]*)\}
これは、or\LeftLabel{
以外のすべての文字が続くすべての文字と一致します。つまり、そのあとに任意数の not が続きます。つまり、後ろにaが続きます。これらの文字の中には、sedが正規表現のアクティブ文字ではなく通常の文字として扱うように、バックスラッシュが前にある必要があります。また、中括弧内の文字は括弧内に表示されます。角かっこは正規表現のアクティブ文字で、sedに内容をグループ1として保存するように指示します。コマンドセクションでこれらの文字を引用することができます。$
}
[^$}]
}
[^}]*
}
\1
new