sed 모든 탭과 공백을 단일 공백으로 바꿉니다.


23

다음과 같은 문자열이 있습니다.

test.de.          1547    IN      SOA     ns1.test.de. dnsmaster.test.de. 2012090701 900 1000 6000 600

이제 레코드 사이의 모든 탭 / 공백을 단일 공백으로 바꾸고 싶습니다. cut -d " "

나는 다음을 시도했다.

sed "s/[\t[:space:]]+/[:space:]/g"

다양한 종류가 있지만 작동하지 못했습니다. 어떤 아이디어?


시도 : sed -r -e "s / [\ t \] + / / g"
RJS

당신합니까 cut지원의 -w옵션은?
Kondybas

답변:


40

용도 sed -e "s/[[:space:]]\+/ /g"

여기에 설명이 있습니다 :

[   # start of character class

  [:space:]  # The POSIX character class for whitespace characters. It's
             # functionally identical to [ \t\r\n\v\f] which matches a space,
             # tab, carriage return, newline, vertical tab, or form feed. See
             # https://en.wikipedia.org/wiki/Regular_expression#POSIX_character_classes

]   # end of character class

\+  # one or more of the previous item (anything matched in the brackets).

교체를 위해 공백 만 삽입하려고합니다. [:space:]문자 클래스의 약어이므로 정규식 엔진이 어떤 문자를 넣을지 알지 못하므로 거기에서 작동하지 않습니다.

+때문에의 나오지 정규식 엔진과 정규식에서 탈출해야하는 +반면 일반 문자 \+'하나 더'에 대한 메타 문자입니다. 정규 표현식 마스터 링의 86 페이지 에서 Jeffrey Friedl은 ed와 grep이 이스케이프 된 괄호를 사용했다고 각주에 언급했습니다. " 나는 그가 더하기 기호에 대해 같은 방식을 느꼈기 때문에 메타 문자로 사용하려면 그것을 피할 필요가 있다고 생각합니다. 이것으로 쉽게 넘어 질 수 있습니다.

에서 당신이 탈출해야합니다 나오지도 +, ?, |, (,와 ). 또는 다음과 같이 보인다 (확장 정규식을 사용하는 -r 사용 sed -r -e "s/[[:space:]]\+/ /g"또는sed -re "s/[[:space:]]\+/ /g"


탭도 제거됩니까? 왜 \+대신 사용하는 이유를 설명 할 수 있습니까 +?
Zulakis

알았어요 [[: space :]]는 [\ t \ r \ n \ v \ f]와 같습니다. 그러나 당신이 왜 사용하는지 설명해 주시겠습니까?\+
Zulakis

3
[[: space :]]는 '\ s'와 동일하므로 더 짧은 버전은 "s / \ s \ + / / g"
3molo

2
기본 정규 표현식은 "이전 문자 또는 그룹 중 하나 이상", 소스 developer.apple.com/library/mac/#documentation/opensource/… 를 의미 할 때 더하기 부호 앞에 백 슬래시를 사용합니다 .
3molo

아, 이해합니다! 다른 정규식 버전이 있다는 것을 몰랐습니다. 감사합니다
Zulakis

6

다음의 -s( "squeeze") 옵션을 사용할 수 있습니다 tr.

$ tr -s '[:blank:]' <<< 'test.de.          1547    IN      SOA     ns1.test.de. dnsmaster.test.de. 2012090701 900 1000 6000 600'
test.de. 1547 IN SOA ns1.test.de. dnsmaster.test.de. 2012090701 900 1000 6000 600

[:blank:]문자 클래스 탭은 공간 및 모두를 포함한다.


-2

bash에 다음 별칭을 사용하는 것이 좋습니다. 다른 사람들이 작성한 내용을 바탕으로 sed를 사용하여 여러 공백을 검색하고 단일 공백으로 바꿉니다. 이렇게하면 컷에서 일관된 결과를 얻을 수 있습니다. 마지막으로, sed를 한 번 더 실행하여 더 쉽게 읽을 수 있도록 탭으로 공간을 변경하십시오.

alias ll='ls -lh | sed "s/ \+/ /g" | cut -f5,9 -d" " | sed "s/ /\t/g"'

이 질문에 어떻게 대답합니까?
Tonin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.