sed 명령이 내가 원하는 것을 반환하지 않습니다

sed 명령이 내가 원하는 것을 반환하지 않습니다

내 문서 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개행 문자로 해석하여 의 출력에 모든 대문자의 순서가 포함되도록 하는 것입니다. 그러면 관심 있는 사람을 위해 전자 행위를 할 수 있습니다.scuppertrxgrep

다음과 같이 입력하면 다음과 같이 FOO BAR02 ABCDEF인쇄됩니다.

FOO
BAR

이전 솔루션에서는 가 인쇄되지만 DEFGNU가 있는 경우 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'

...이렇게 하면 대문자가 확실히 포함된 줄의 시작 부분에서 대문자가 아닌 모든 문자가 제거되고 결과가 인쇄됩니다. 이것은 행당 하나의 세트에서만 작동하지만 귀하의 의견에 따르면 그게 전부라고 가정합니까?

관련 정보