다음 형식의 한 줄 파일이 있습니다.
{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
grep
PCRE 지원과 함께 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