sed:角括弧で囲まれたストリップ

sed:角括弧で囲まれたストリップ

私はこのファイルを持っています:

[default]
region = us-east-1
output = json
[profile automation]
region = us-east-1
output = json
[profile qa]
region = us-east-1
output = json

次のようにプロファイル名を抽出します。

default
automation
qa

これまで私のsed:

gsed 's?\[[^\ ]*\ \([^\]]*\)?\1?' ~/.aws/config

\([^\]]*\)テストすると、スペースの後ろの最初の文字だけが一致することがわかります(たとえば、in aautomationin qqaなど)。なぜ一度だけ一致するのですか?それを削除するより良い方法はありますか[]?ありがとうございます。

答え1

括弧内のバックスラッシュはリテラルです。あなたが欲しい[^]]。式は[^\]]*バックスラッシュ以外の項目と一致し、その後にオプションです]

$ sed -En 's/^\[(.* )?([^]]*)\]$/\2/p' file
default
automation
qa

[...]たとえば、スペースで終わるオプションの単語を内部の最初の部分文字列として受け入れます[group name]。これらのオプションの単語の後の文字列(まで])は、2番目のグループにキャプチャされます。

各行のデフォルト印刷はオフになり-n、代わりに各置換が成功した後に明示的に印刷されます。

修飾子は拡張正規表現修飾子である-Eため、これが必要です。?

それ以外の場合は代わりに-E使用できます(キャプチャとをそれぞれに変更)。\{0,1\}?()\(\)

答え2

GNUgrepまたは互換PCREサポートで構築:

grep -Po '^\h*\[\h*(\H+\h+)?\K.*[^]\h](?=\h*\]\s*$)'

MS Windowsのiniファイルでよく見られるCR文字の垂直スペースを含む、インデントに前の水平スペースと後のスペースを許可することもあります。

次のように入力すると:

[default]
[profile automation]
[profile a  b]
[profile  c d ]

それは以下を提供します:

default
automation
a  b
c d

関連情報