아래와 같이 파일의 다른 줄에 두 개의 문자열/경로가 있습니다.
cmd a/b/c -x -y
cmd a/b/c -x
이 두 문자열 중에서 두 번째 문자열만 교체하고 싶습니다. 두 번째 문자열을 교체 했지만 sed
명령의 버그로 인해 두 문자열을 모두 교체하고 있습니다. sed
이를 수행하려면 bash의 사용법이나 다른 명령을 알려주십시오 .
답변1
sed에는 다른 정규식 엔진에서 지원하는 멋진 미리보기 기능이 없지만 여전히 원하는 대로 수행할 수 있습니다. 노력하다:
sed 's@cmd a/b/c -x -y@\n@g; s@cmd a/b/c -x@New String@g; s@\n@cmd a/b/c -x -y@'
예
$ cat file
(1). cmd a/b/c -x -y (2). cmd a/b/c -x
$ sed 's@cmd a/b/c -x -y@\n@g; s@cmd a/b/c -x@New String@g; s@\n@cmd a/b/c -x -y@' file
(1). cmd a/b/c -x -y (2). New String
어떻게 작동하나요?
s@cmd a/b/c -x -y@\n@g
그러면 원하지 않는 문자열이 개행 문자로 대체됩니다.
s@cmd a/b/c -x@New String@g
이렇게 하면 원하는 교체가 이루어집니다.
s@\n@cmd a/b/c -x -y@
그러면 원하는 문자열이 변경되지 않고 복원됩니다.
변수 사용
sed에서 변수를 사용할 수 있지만 오류, 예상치 못한 결과, 보안 위반 등의 문제로 가득 차 있습니다. awk는 변수를 쉽고 안전하게 처리하는 데 훨씬 더 나은 작업을 수행합니다.
먼저 쉘 변수를 생성해 보겠습니다.
keep='cmd a/b/c -x -y'
target='cmd a/b/c -x'
new='New String'
이제 awk 명령을 실행해 보겠습니다.
$ awk -v k="$keep" -v t="$target" -v n="$new" '{gsub(k, "\n"); gsub(t, n); gsub(/\n/, k)} 1' file
(1). cmd a/b/c -x -y (2). New String
awk 명령의 논리는 sed의 논리와 정확히 동일합니다.
작동 방식:
-v k="$keep" -v t="$target" -v n="$new"
이러한 옵션은 쉘 변수를 사용 하고
keep
awk 변수 및 각각 을 정의합니다 .target
new
k
t
n
k
및 는 정규식t
으로 처리됩니다.+
또는 같은 정규식 활성 문자가 포함된 경우*
백슬래시로 이스케이프해야 합니다.gsub(k, "\n")
그러면 모든 항목이 개행 문자로 대체됩니다
k
.gsub(t, n)
그러면 대상 문자열의 모든 항목이
t
새 문자열로 대체됩니다n
.gsub(/\n/, k)
그러면 문자열이 복원됩니다
k
.1
이것은 awk에게 라인을 인쇄하라고 지시합니다.