검색하고 바꾸려면 grep(sed 아님)을 사용하세요.

검색하고 바꾸려면 grep(sed 아님)을 사용하세요.

나는 그것을 읽고 sed그것이 grep명령에서 발전했다는 것을 발견했습니다.

~에 따르면https://en.wikipedia.org/wiki/Sed,

Unix 버전 7에 처음 등장한 sed는 데이터 파일의 명령줄 처리를 위해 만들어진 초기 Unix 명령 중 하나입니다. 널리 사용되는 grep 명령의 자연스러운 후속 버전입니다. 원래 동기는 grep(g/re/p)과 유사한 대체이므로 "g/re/s"입니다.

sed 검색 및 교체

sed 's/old/new/' Example.txt

grep그래서 같은 일을 하는 것이 가능한지 궁금합니다 sed.

grep가능하다면 via 대신 via를 통해 동일한 작업을 수행하는 방법을 알려주십시오 sed.

답변1

grep패턴과 일치하는 줄만(그리고 처음에만) 인쇄하는 데 사용됩니다. 이것이 의미하는 바입니다( 명령 grep에 따라 ).g/re/p ed

이제 일부 grep구현에서는 다른 명령의 기능을 약간 침해하는 기능을 추가합니다. 예를 들어, 일부는 작업 의 일부를 수행하기 위해 -r// 일부를 가지고 있습니다.--include--excludefind

GNU는 일치하는 줄을 편집할 때 작업의 일부를 수행 하는 옵션을 grep추가했습니다 .-osed

pcregrep캡처 그룹이 일치하는 것을 인쇄하려면 -o1, ... 로 확장하세요. -o2따라서 해당 구현을 사용하면 이를 위해 설계되지 않았더라도 실제로 다음을 대체할 수 있습니다.

sed 's/old/new/'

그리고:

pcregrep --om-separator=new  -o1 -o2 '(.*?)old(.*)'

그러나 캡처 그룹이 빈 문자열과 일치하면 올바르게 작동하지 않습니다. 다음과 같이 입력하면:

XoldY
Xold
oldY

그것은 다음을 제공합니다:

XnewY
X
Y

이 문제를 해결하기 위해 다음과 같은 더 역겨운 트릭을 사용할 수 있습니다.

PCREGREP_COLOR= pcregrep --color=always '.*old.*' |
  pcregrep --om-separator=new -o1 -o2 '^..(.+?)old(.+)..' |
  pcregrep -o1 '.(.*).'

즉, \e[m일치하는 모든 줄에 (채색 이스케이프 시퀀스)를 추가하여 의 양쪽에 문자가 하나 이상 있는지 확인한 old다음 제거합니다.

답변2

아니요, grep은 한 번의 호출로 대체를 수행할 수 없습니다. 이것이 바로 sed(나중에 더 나은 텍스트 처리 언어인 awk)가 필요한 이유입니다.

답변3

우그레프, 다음과 호환됩니다.GNU grep--replace, 옵션이 있으므로

ugrep --replace=new old Example.txt

동등하다

sed s/old/new/ Example.txt

립그렙동등한 명령줄 플래그도 있습니다:

rg --replace new old Example.txt

관련 정보