나는 그것을 읽고 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
--exclude
find
GNU는 일치하는 줄을 편집할 때 작업의 일부를 수행 하는 옵션을 grep
추가했습니다 .-o
sed
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)가 필요한 이유입니다.