1

*.ini ファイルのセクション エントリのようなものを解析したい:

line='      [          fdfd fdf         f   ]  '

この行を分割するための sed パターン (???) は何でしょうか?

'fdfd fdf         f'

アウト?

そう:

echo "${line}" | sed -E 's/???/\1/g'

[[:space:]][およびを除くすべての文字をどのように説明でき]ますか? これは私にはうまくいきません: [^[[:space:]]\[]*.

4

3 に答える 3

3

この構文を使用する場合[[:space:]]、外側の括弧は通常の「このリストの 1 文字に一致する」括弧であり、 と同じです[aeiou]が、内側の括弧は[:space:]分割できない単位の一部です。

spaceしたがって、クラスに属するか、または使用する単一の文字に一致させたいx場合は、[[:space:]x][x[:space:]]

一致させたい文字の 1 つが である場合]、特別な処理を行わない限り、括弧で囲まれた文字リストは終了します。どこかにバックスラッシュが必要だと推測しました。良い推測ですが、間違っています。リストに a を含める方法は、]最初に置くことです。[ab]c]は 2 文字を含む括弧付きリストでありab、その後に 2 つのリテラル一致文字が続くc]ため、"ac]"orに一致します"bc]"[]abc]、4 文字の括弧付きリストであるため、 、、、または]abcと一致します。"a""b""c""]"

否定リストでは、は の]直後に来^ます。

したがって、すべてをまとめると、[:space:]クラスと括弧を除くすべての文字のセットから単一の文字を一致させる方法は次のとおりです。

[^][:space:][]

最初のブラケットと最後のブラケットは、一致するペアであるように見えないとしても、一致するペアです。

于 2012-08-31T01:11:32.053 に答える
0
$ echo "$line" | sed "s/^.*\[[[:space:]]*\([^]]*[^][:space:]]\)[[:space:]]*\].*$/'\1'/"

パターンを 2 つに分割できます。

$ echo "$line" | sed "s/^.*\[[[:space:]]*/'/; s/[[:space:]]*\].*$/'/"

awkあまりにも動作します:

$ echo "$line" | awk -F' *[[\]] *' -vQ="'" '{print Q$2Q}'
于 2012-08-31T01:08:47.577 に答える
0

分割と言うとき、配列に分割するという意味ですか、それともすべてのスペースと括弧を除外するという意味ですか?

file.ini の行番号 1 の値を次のように仮定します。

  [          fdfd fdf         f   ]  

配列のことなら、

$linenumber=1;
array=($(sed -n ${linenumber}p file.ini | sed 's/[][]*//g'));

file.ini の行番号 1 を配列に分割し、値を返します。

${array[0]} = fdfd
${array[1]} = fdf
${array[2]} = f

フィルタースペースとブラケットを意味する場合、

$linenumber=1;
sed -n ${linenumber}p file.ini | sed 's/[ []]*//g';

戻ります:

fdfdfdff

どちらも意図したものではない場合は、初期値から抽出しようとしている正確な出力を指定して、正しく対処できるようにしてください。

于 2012-08-31T01:34:48.550 に答える