공백없이 선행하는 방법은 무엇입니까?


17

나는 큰 코드베이스를 통해 greping하고 있으며 공백과 표의 선행은 상당히 성가신 것 같습니다. 그것을 제거 할 수있는 방법이 있습니까?

grep -R "something" ./

예를 들어 :

foo/bar.cpp:                       qwertyuiosomethingoi
foo/bar/baz.h:                          43rfsgsomethingdrfg
bar/bar.cpp:            1234edwssomethingczd

나는 다음과 같은 것을 얻고 싶다 :

foo/bar.cpp: qwertyuiosomethingoi
foo/bar/baz.h: 43rfsgdsomethingrfg
bar/bar.cpp: 1234edwssomethingczd

또는 더 나은 :

foo/bar.cpp:   qwertyuisomethingooi
foo/bar/baz.h: 43rfsgdrsomethingfg
bar/bar.cpp:   1234edwssomethingczd

어디서 제거합니까? 출력에서? 검색 패턴에서?
Ignacio Vazquez-Abrams

출력에서 @Ignacio. 업데이트 된 질문
Andrew

답변:


4

테스트 파일 작성

echo -e "\t   foo-somethingfoo" >something.foo
echo "    bar-bar-somethingbar" >something.bar_bar
echo "baz-baz-baz-somethingbaz" >something.baz_baz_baz
echo "  spaces    something  s" >something.spaces

전체 영광스러운 색상을 생성 :)

grep --colour=always "something" something.* | 
 sed -re  's/^([^:]+):(\x1b\[m\x1b\[K)[[:space:]]*(.*)/\1\x01\2\3/' |
   column -s $'\x01' -t

출력 (컬러를 얻으려면 실행하십시오).

something.bar_bar      bar-bar-somethingbar
something.baz_baz_baz  baz-baz-baz-somethingbaz
something.foo          foo-somethingfoo
something.spaces       spaces    something  s

테스트 gnome-terminal, konsole, terminator,xterm


잘 했어! 하지만 약간의 문제는 \t문자 를 일치시키는 것을 잊는 것입니다
Andrew

\t? ... \t세퍼레이터를 사용하지 않고 $ '\ x01'(16 진수 01)을 사용하고 있습니다. 아니면 다른 의미가 있습니까?
Peter.O

\t선행 공백뿐만 아니라 선행 표가있을 수 있음을 의미합니다.\s
Andrew

... 고정. ```를 [[:space:]]...으로 변경했습니다 . 공백 과 전부가 아닌 TAB과 SPACE 만 고려 하려면 다음을 대신 사용하십시오.[ \t]
Peter.O

6

당신은 그들을 사용하여 그들을 제거 할 수 있습니다 sed

grep blah filename.foo | sed -e 's/^[ \t]*//'

출력에서 선행 공백을 제거합니다.


1
출력에서 줄의 시작 부분에 공백이 없으므로 효과가 없습니다.
Abhishek A

6

re하나의 파일에서 패턴 (기본 정규 표현식)을 찾고 있다고 가정 하고 일치하는 모든 행에서 선행 공백을 제거하려고합니다.

sed -n -e 's/^[[:blank:]]*//' -e '/re/p' thefile.c

(실제로, 이것은 모든 선행 공백을 먼저 제거한 다음 패턴을 찾습니다. 그러나 결과는 같습니다)

grep편집 된 질문에서와 같이 대신 출력 을 사후 처리하려면 다음을 수행하십시오 .

grep re * | sed 's/:[[:blank:]]*/: /'

패턴이 [[:blank:]]*0 개 이상의 공백 또는 탭과 일치합니다.


감사합니다. 마지막 스 니펫은 정상적으로 작동합니다. 출력 색상을 유지하는 방법이 있습니까?
앤드류

색깔? 구식이라고 불러주세요.하지만 터미널은 검은 색과 주황색입니다. ( "모르겠습니다").
Kusalananda

3
grep 호출에서 --color = always (GNU grep 가정)를 사용하십시오. sed 호출은 색상을 제거하지 않으며 출력이 터미널로 이동하지 않을 때 색상을 사용하지 않는 grep 자체입니다 (기본값은 --color = auto). "항상"은 항상 색을 사용 하도록 강요합니다 .
Jürgen A. Erhard

@ Jugen, 감사합니다,하지만 --color=always이 정규 표현식 과 함께 작동하지 않습니다 : /
앤드류

1
아 uck, 네 말이 맞아 콜론과 공백 사이에 색상에 대한 제어 시퀀스가 ​​있기 때문입니다. 이스케이프 시퀀스를 sed 호출에 넣을 수 있습니다 (이 시퀀스는 최소한 bog 표준 vt100 에뮬레이션 (xterm, 스크린 등) "\ 033 [m \ 033 [K"에 해당합니다.; D
Jürgen A Erhard

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