![sed 명령이 내가 원하는 것을 반환하지 않습니다](https://linux55.com/image/4770/sed%20%EB%AA%85%EB%A0%B9%EC%9D%B4%20%EB%82%B4%EA%B0%80%20%EC%9B%90%ED%95%98%EB%8A%94%20%EA%B2%83%EC%9D%84%20%EB%B0%98%ED%99%98%ED%95%98%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4.png)
내 문서 doc.lst는 다음과 같은 숫자와 문자로 구성되어 있습니다. 01 ABC, "ABC" 부분만 사용하겠습니다. 이것을 시도했지만 내 result.lst의 숫자가 포함되어 있습니다.
sed -n -e '/[A-Z][A-Z][A-Z]/p' < doc.lst > result.lst
이 번호를 어떻게 삭제하나요?
답변1
sed -n -e '/[A-Z][A-Z][A-Z]/p'
이 정규식과 일치하는 줄을 인쇄합니다.
원하는 곳은 다음과 같습니다.
sed -n 's/.*\([[:upper:]]\{3\}\).*/\1/p'
\1
즉, 임의의 문자 시퀀스(가능한 한 많이), 3개의 대문자(capture 포함 ) , 그 뒤에 캡처된 문자로 구성된 임의의 문자 시퀀스 를 바꾸고 \(...\)
일치하는 경우 인쇄합니다. 그 대체 결과( p
명령의 플래그) s
.
한 줄에 한 세트(가장 오른쪽 세트)만 인쇄됩니다.
모두 인쇄하려면 다음을 수행하십시오.
tr -cs '[:upper:]' '[\n*]' | grep -Ex '.{3}'
(일부 tr
구현에서는 멀티바이트 문자를 올바르게 처리하지 못합니다.)
아이디어는 대문자와 소문자의 상호보완적인 순서를 tr개행 문자로 해석하여 의 출력에 모든 대문자의 순서가 포함되도록 하는 것입니다. 그러면 관심 있는 사람을 위해 전자 행위를 할 수 있습니다.scuppertr
xgrep
다음과 같이 입력하면 다음과 같이 FOO BAR02 ABCDEF
인쇄됩니다.
FOO
BAR
이전 솔루션에서는 가 인쇄되지만 DEF
GNU가 있는 경우 grep
해당 옵션을 사용할 수 있습니다 -o
.
grep -Eo '[[:upper:]]{3}'
그러면 다음이 인쇄됩니다:
FOO
BAR
ABC
DEF
답변2
이런 목록의 경우...
01ABC
03BHG
2TG
...당신이 할 수 있는 일이 많아요.
아마도 가장 간단한 방법은 다음과 같이 할 수 있다는 것입니다.
sed 's/[^[:upper:]]\{1,\}/\n/g;/^\n/D'
...이것은 단순히 ewline을 대문자가 아닌 문자 시퀀스로 대체 하고 ewline으로 시작하는 후속 결과를 \n
인쇄하지 않도록 합니다 .\n
(단, 대문자를 유지해도 인쇄는 됩니다).
대문자 뒤에 숫자를 유지하려면 다음을 시도해 보십시오.
sed -n '/[[:upper:]]/s/[^[:upper:]]*//p'
...이렇게 하면 대문자가 확실히 포함된 줄의 시작 부분에서 대문자가 아닌 모든 문자가 제거되고 결과가 인쇄됩니다. 이것은 행당 하나의 세트에서만 작동하지만 귀하의 의견에 따르면 그게 전부라고 가정합니까?