grepの正規表現パターンの作成

grepの正規表現パターンの作成

だから私はこのような文字列を持っています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できません。したがって、以下を使用してください。,\|sedsed -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つを置き換えspその行を印刷します。)

第三に、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番目のケースのアスタリスクです。

おすすめ記事