sed
x 공백으로 시작하고 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/'