정규식에 문제가 있습니다 sed
.
파일의 한 줄을 변경하고 싶어서 다음과 같이 했습니다.
sed -i '3s/.*/my new text in file/' file.txt
.
이 확장은 파일의 세 번째 줄을 찾아 변경합니다.
이 솔루션은 좋지 않지만 좋은 일반 확장을 구축하는 방법을 모르겠습니다. 파일에서 "호스트"라는 단어를 찾고 있다고 가정해 보겠습니다. 좋은 일반 확장을 구축하는 방법은 무엇입니까?
나는 다음을 시도했습니다 :
sed -e '<\H...s>\ /my new text in file/' file.txt
'.
내가 뭘 잘못했나요?
답변1
거의 아무도 사용하지 않는 것 같지만 전체 줄 교체를 위한 (변경) 명령을 sed
제공합니다 .c
c\ text Delete the lines matching the address or address-range, and output the lines of text which follow this command.
예를 들어 다음을 사용할 수 있습니다.
sed '/\bHost\b/c\
my new text
' file
전체 단어를 포함하는 줄 Host
을 로 변경합니다 my new text
. 이 \b
시퀀스는 단어 경계를 나타내므로 부분 일치를 제외합니다. 예를 들어 Hostname
GNU sed에서는 ie 대신 \<
새 텍스트를 줄에 넣을 수도 있습니다.\>
\<Host\>
sed '/\<Host\>/cmy new text' hostfile
이것이 표현식에서 목표로 삼은 것 같습니다. 실제 c
명령을 놓치고 단어 경계 지정자를 거꾸로 가져왔습니다. 즉, <\. . .>\
대신\<. . .\>
답변2
$ sed 's/^.*[[:<:]]Host[[:>:]].*$/replacement text/' file.txt
file.txt
위의 코드는 해당 단어가 포함된 파일의 모든 줄을 문자열로 대체합니다 . 결과는 표준 출력으로 제공됩니다.Host
replacement text
이는 [[:<:]]
단어의 시작 부분과 일치하는 길이가 0인 패턴입니다. 마찬가지로 [[:>:]]
단어의 끝도 일치됩니다. 이는 위의 교체가아니요Hostname
한 줄을 or 라는 단어로 바꿉니다 xHost
(해당 단어가 Host
줄의 다른 곳에 나타나지 않는 한).