Unix sed 명령은 파일의 대괄호를 대체합니다.

Unix sed 명령은 파일의 대괄호를 대체합니다.

파일에서 교체해야 합니다 "...". <...>이 명령을 사용하여 sed '/^#include/s/"/</g' file.c찾았습니다.여기, 그러나 출력이 올바르지 않습니다. 이 문제를 어떻게 해결할 수 있나요?

입력하다:

#include "stdlib.h"
#include "graph.h"

산출:

#include <stdlib.h<
#include <graph.h<

예상 출력:

#include <stdlib.h>
#include <graph.h>

답변1

이 명령의 문제는 g끝에 있습니다. 이어질 것이다모두<일치하는 큰따옴표는 각 줄에서 대체됩니다 ^#include. 귀하가 링크한 StackOverflow 질문이 원하는 대로 다른 방법이 아닌 <>( 사용하거나 ""문제의 줄에서 y/<>/""/덜 효율적으로 수행 할 수 있음)로 바꾸는 것과 관련되어 있음을 참고하십시오.s/[<>]/"/g

s/"/</(no g)를 먼저 사용한 다음 s/"/>( 여기서도 아님) 을 사용해도 g괜찮습니다 .

sed '/^#include/ { s/"/</; s/"/>/; }' file.c >file-new.c

첫 번째 대체는 첫 번째 큰따옴표를 대체하고, 두 번째 대체는 현재 수정된 문자열의 첫 번째 큰따옴표를 대체합니다.

파일을 수정하려면(내부 편집을 수행했다고 가정) <줄 끝을 다음으로 바꾸세요 >.

sed '/^#include/ s/<$/>/' file.c >file-new.c

이는 <$( <줄 끝의 an)과 일치하고 로 대체됩니다 >.

결과를 보고 괜찮다면 file-new.c교체하세요.file.c

답변2

"두 개의 동일한 문자를 두 개의 문자로 바꿔야 합니다 .분명히문자 <및 . 귀하의 명령은 한 문자 >의 모든 항목을 바꾸기 때문에 작동하지 않습니다."하나문자만 <. 그러니 이것을 시도해 보세요:

# capture the final word between double quotes
# and replace it for itself enclosed in brackets
$ sed '/^#include/s/"\([^"]*\)"/<\1>/' file
#include <stdlib.h>
#include <graph.h>

관련 정보