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

答え2

そしてawk

... | awk -F'= ' '{gsub(", ", "\\|", $2); print $2}'
  • -F '= 'フィールド区切り記号を次のように設定します。=

  • gsub(", ", "\\|", $2)2番目のフィールドの,すべての項目を次に置き換えます。\|

  • print $22番目のフィールドの印刷

例:

$ awk -F'= ' '{gsub(", ", "\\|", $2); print $2}' <<<'LST = fr, de, pl, ru, ch, us, uk, ca'
fr\|de\|pl\|ru\|ch\|us\|uk\|ca

答え3

fr\|de\|pl\|ru\|ch\|us\|uk\|caただし、grepの正規表現には標準/移植性はありません。

fr
de
pl
ru
ch
us
uk
ca

これは改行で区切られた項目であり、標準であり、grep -F固定文字列検索にも使用できます。したがって、クエリに正規表現演算子が含まれている場合は問題ありません。

したがって、次のことができます(ここではスクリプトに使用したくないPOSIXシェル構文を使用してcsh)。

search_term=$(
  sed '
    /^LST *= */!d
    s///
    s/ *, */\
/g' config.ini
)

grep -F -- "$search_term" some-file

実装がサポートしている場合は、単語全体を検索するオプションを渡すこともgrepできます。-w

答え4

perl -p0E '($_)= /LST = (.*)/; s/, /\\|/g' config.ini

関連情報