
だから私はこのような文字列を持っています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番目のケースのアスタリスクです。
答え2
そしてawk
:
... | awk -F'= ' '{gsub(", ", "\\|", $2); print $2}'
-F '= '
フィールド区切り記号を次のように設定します。=
gsub(", ", "\\|", $2)
2番目のフィールドの,
すべての項目を次に置き換えます。\|
print $2
2番目のフィールドの印刷
例:
$ 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