だから私はこのような文字列を持っていますLST = fr, de, pl, ru, ch, us, uk, ca
。ここでは、将来のgrep操作用の正規表現パターンを生成する必要があるため、文字列を次のように変更する必要があります。fr\|de\|pl\|ru\|ch\|us\|uk\|ca
set LST = `grep "^LST *=" /remote/file/config.ini | sed 's/LST *= *//' | sed 's/ *//g' | tr , "\|"`
残念ながら、tr , "\\|"
与えられた文字は私の正規表現パターンを作成するために置き換えられません。結果はですfrdeplruchusukca
。正規表現パターンを生成するにはどうすればよいですか?または、LST変数の発生を見つけてde
見つかった値をLST変数に設定するにはどうすればよいですか?
config.iniの例
; sample of ini file
[SITE_PREF]
LST = fr, de, pl, ru, ch, us, uk, ca
TASKLIST = T1,TT3,TT0
ベストアンサー1
まず、一度に1文字しか処理できず、aをa(1〜2文字)に置き換えることはtr
できません。したがって、以下を使用してください。,
\|
sed
sed -e 's/,/\\|/'
次に、BashとGNU sedで動作しているように見えるthegrep
とsを組み合わせることができます。sed
$ LST=$(sed -n '/^LST *=/ {s/^LST *= *//; s/, */\\|/g; p}' config.ini)
$ echo "$LST"
fr\|de\|pl\|ru\|ch\|us\|uk\|ca
(基本的には次のようになります。一致するすべての行で中かっこ内/^LST *=/
で作業を実行します。2つを置き換えs
てp
その行を印刷します。)
第三に、tr
引用符が有効かどうかに応じて、カンマをバックスラッシュまたはパイプに変更する必要があります。
$ echo "fr,de,pl" | tr , "\|"
fr|de|pl
$ echo "fr,de,pl" | tr , '\\|'
fr\de\pl
しかし、あなたはそうしなかったし、何も得られませんでした。 Bashでこれを再現することはできませんが、set
構文は次のとおりです。csh
これを使用すると奇妙な動作が発生しますtcsh
。場合によっては。すべてではありません。
いいね:
$ tcsh
> echo "fr,de,pl" | sed 's/,/\\|/'
fr\|de,pl
> set LST = `echo "fr,de,pl" | sed 's/,/\\|/'`
> printf "%s\n" "$LST"
fr\|de,pl
あまり良くない:
$ tcsh
> echo "fr,de,pl" | sed 's/, */\\|/'
fr\|de,pl
> set LST = `echo "fr,de,pl" | sed 's/, */\\|/'`
> printf "%s\n" "$LST"
fr|de,pl
私が見ることができる唯一の違いは、2番目のケースのアスタリスクです。