sed를 사용하여 n 공백으로 시작하고 n 공백으로 끝나는 문자열 자르기

sed를 사용하여 n 공백으로 시작하고 n 공백으로 끝나는 문자열 자르기

sedx 공백으로 시작하고 y 공백으로 끝나는 잘라내기 텍스트를 사용하는 방법은 무엇입니까 ?

예를 들어 이것은 내 문자열입니다.

 kkk 111 fff      aaabbb 5d98 ccc         mmmppp 9369d

나는 다음과 같은 출력을 얻고 싶습니다.

 aaabbb 5d98 ccc

(공백 수는 알 수 없음)

감사해요.

답변1

우리는 공백의 양을 알 수 없는 일부 텍스트에 대해 이야기하고 있습니다.

sed 's/.* \{2,\}\([[:alnum:]].*\) \{2,\}.*/\1/'

또는 -r(-E)을 사용하여

sed -E 's/.* {2,}([[:alnum:]].*) {2,}.*/\1/'

적절한 것 같지만 grep이 경우에는 더 좋습니다.

grep -Po ' {2,}\K[[:alnum:]].*(?= {2,})'

그렇게 강력하지는 않지만(단지 두 칸만) 정확합니다.

sed -E 's/.*  (\w.*)  .*/\1/'

답변2

-r편집: 백래시 염증을 치료하기 위해 jimmij(확장 정규식 구문 활성화)에서 플래그를 빌렸습니다 .

다음 조건에서 다음 작업을 수행하십시오.

  • 필드 구분 기호가 최소한이라고 말할 수 있습니까?N공간(예: 3)
  • 관심 필드의 내용에는 공백이 포함되어 있지 않습니다.

이 경우 다음 정규식이 작동합니다.

    echo ' 01      Title      Chapter 01' |
    sed -r 's/^.* {3,}([^ ]+) {3,}.*$/\1/'

또는 백슬래시를 선호하는 경우 확장되지 않은 정규식 구문은 다음과 같습니다.

    echo ' 01      Title      Chapter 01' |
    sed 's/^.* \{3,\}\([^ ]\+\) \{3,\}.*$/\1/'

정규식 설명:

^        start of line
.*       any number of characters at the start of the line
 {3,}    at least 3 spaces
([^ ]+)  1 or more non-space characters (capture this group as \1)
 {3,}    at least 3 spaces
.*       anything on the rest of the line
$        end of the line. Not needed, because of the .*, but nicely explicit.

답변3

양쪽에 동일한 수의 공백을 원한다고 가정합니다.

$ sed -r 's/(^|.*[^[:space:]])([[:space:]]+)([^[:space:]]+)\2([^[:space:]].*|$)/\3/g' <<<"01      Title      Chapter 01"
Title

(단순한 공백이 아닌 문자 클래스를 사용했기 때문에 표현이 훨씬 짧아야 합니다 :) sed -r 's/(^|.*[^ ])( +)([^ ]+)\2([^ ].*|$)/\3/g'.

LHS에서 역참조를 사용하여 양쪽에 동일한 수의 공백이 있는지 확인합니다.

답변4

-r내부 문자 수를 지정할 수 있는 확장 정규식 옵션을 사용할 수 있으므로 {}다음은 모두 인쇄됩니다.성격6개의 공간으로 둘러싸여 있습니다.

sed -r 's/.* {6}(\w*) {6}.*/\1/'

만일을 대비해제목공백도 있습니다. 더 나은 옵션은 다음과 같습니다.

sed -r 's/.* {6}(.*) {6}.*/\1/'

관련 정보