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 a, automationin qqa 등). 왜 한 번만 일치합니까? 그것을 제거하는 더 좋은 방법이 있습니까 []? 감사해요.

답변1

괄호 안에 있는 백슬래시는 리터럴입니다. 당신이 원하는 [^]]. 표현식은 [^\]]*백슬래시가 아닌 항목과 일치하며 그 뒤에는 선택적인 ].

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

[...]예를 들어 공백으로 끝나는 선택적 단어를 내부의 첫 번째 하위 문자열로 허용합니다 [group name]. 이러한 선택적 단어 뒤의 문자열( 까지 ])은 두 번째 그룹에 캡처됩니다.

각 줄의 기본 인쇄는 꺼지고 -n대신 각 대체가 성공한 후에 명시적으로 인쇄됩니다.

수정자는 확장된 정규식 수정자이기 -E때문에 이것이 필요합니다 .?

그렇지 않은 경우 대신 -E사용할 수 있습니다 ( 캡처 및 를 각각 으로 변경 ).\{0,1\}?()\(\)

답변2

GNU grep또는 호환 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

관련 정보