중괄호를 기준으로 한 줄을 여러 부분으로 나누시겠습니까?

중괄호를 기준으로 한 줄을 여러 부분으로 나누시겠습니까?

다음 형식의 한 줄 파일이 있습니다.

{port1 dev1 M1 s} {port1 dev1 M1 s} {port3 dev2 M1 g} {port1 dev1 M1 d} {port1 dev1 M3 g} ...

아래 표시된 대로 이 줄과 cat을 중괄호 { }를 기반으로 하는 출력 파일로 분할하고 싶습니다. 어떻게 해야 하나요?

port1 dev1 M1 s
port1 dev1 M1 s 
port3 dev2 M1 g 
port1 dev1 M1 d 
port1 dev1 M3 g

답변1

펄 사용:

perl -lne 'print for /{(.*?)}/g' file
port1 dev1 M1 s
port1 dev1 M1 s
port3 dev2 M1 g
port1 dev1 M1 d
port1 dev1 M3 g

아니면 sed를 사용하세요:

sed 's/{\([^}]*\)} */\1\n/; P;D' file
port1 dev1 M1 s
port1 dev1 M1 s
port3 dev2 M1 g
port1 dev1 M1 d
port1 dev1 M3 g
...

답변2

grepPCRE 지원과 함께 GNU 사용:

grep -Po '{\K[^}]*'

또는 적어도 공백이 아닌 문자를 포함하는 {}가 아닌 시퀀스의 경우:

grep -o '[^{}]*[^{}[:space:]][^{}]*'

그리고 pcregrep:

pcregrep -o1 '{(.*?)}'

{...}s가 중첩될 수 있는 경우 (그러나 균형이 유지됨):

pcregrep -o1 '{((?:[^{}]+|(?0))*)}'

다음과 같이 입력하면:

{port1 {dev1 dev2} M1 s} {port1 dev1 M1 s}

그것은 다음을 제공합니다:

port1 {dev1 dev2} M1 s
port1 dev1 M1 s

답변3

$ tr '}' '\n' <file | sed -E 's/^ ?\{//'
port1 dev1 M1 s
port1 dev1 M1 s
port3 dev2 M1 g
port1 dev1 M1 d
port1 dev1 M3 g

먼저 }각 개행 문자를 tr. 이렇게 하면 sed명령에 처리할 별도의 줄이 제공되며, 각 줄은 가능한 공백 및 로 시작됩니다 {. 이 문자는 명령에 의해 줄의 시작 부분에서 제거됩니다 sed.

똑같은 일 sed:

sed -E -e 's/ ?\{//g' -e 'y/}/\n/'

명령은 y이 예와 유사하게 작동합니다.tr


GNU awk또는 를 사용 mawk하고 BSD는 사용하지 마십시오 awk.

$ awk -v RS='[{}]' '/[^[:blank:]]/' file
port1 dev1 M1 s
port1 dev1 M1 s
port3 dev2 M1 g
port1 dev1 M1 d
port1 dev1 M3 g

이는 데이터를 또는로 구분된 레코드로 해석한 {다음 }탭이나 공백 이외의 항목이 포함된 각 레코드를 인쇄합니다.


펄 사용:

$ perl -ne 'map { print "$_\n" } /{(.*?)}/g' file
port1 dev1 M1 s
port1 dev1 M1 s
port3 dev2 M1 g
port1 dev1 M1 d
port1 dev1 M3 g

그러면 print주어진 정규식을 입력과 일치시켜 반환된 각 요소에 명령이 적용됩니다. 또한 이 print명령은 각 요소가 별도의 줄에 있도록 개행 문자를 추가합니다.

답변4

GNU sed 솔루션:

sed -e 's/} {/\n/g' -e 's/^{//' -e 's/}//' input-file > output-file

관련 정보