Sed 및 정규 표현식

Sed 및 정규 표현식

정규식에 문제가 있습니다 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시퀀스는 단어 경계를 나타내므로 부분 일치를 제외합니다. 예를 들어 HostnameGNU sed에서는 ie 대신 \<새 텍스트를 줄에 넣을 수도 있습니다.\>\<Host\>

sed '/\<Host\>/cmy new text' hostfile

이것이 표현식에서 목표로 삼은 것 같습니다. 실제 c명령을 놓치고 단어 경계 지정자를 거꾸로 가져왔습니다. 즉, <\. . .>\대신\<. . .\>

답변2

$ sed 's/^.*[[:<:]]Host[[:>:]].*$/replacement text/' file.txt

file.txt위의 코드는 해당 단어가 포함된 파일의 모든 줄을 문자열로 대체합니다 . 결과는 표준 출력으로 제공됩니다.Hostreplacement text

이는 [[:<:]]단어의 시작 부분과 일치하는 길이가 0인 패턴입니다. 마찬가지로 [[:>:]]단어의 끝도 일치됩니다. 이는 위의 교체가아니요Hostname한 줄을 or 라는 단어로 바꿉니다 xHost(해당 단어가 Host줄의 다른 곳에 나타나지 않는 한).

관련 정보