Bash의 모든 문자열에서 특정 하위 문자열을 바꾸는 방법은 무엇입니까? [폐쇄]

Bash의 모든 문자열에서 특정 하위 문자열을 바꾸는 방법은 무엇입니까? [폐쇄]

아래와 같이 파일의 다른 줄에 두 개의 문자열/경로가 있습니다.

    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"

    이러한 옵션은 쉘 변수를 사용 하고 keepawk 변수 및 각각 을 정의합니다 .targetnewktn

    k및 는 정규식 t으로 처리됩니다. +또는 같은 정규식 활성 문자가 포함된 경우 *백슬래시로 이스케이프해야 합니다.

  • gsub(k, "\n")

    그러면 모든 항목이 개행 문자로 대체됩니다 k.

  • gsub(t, n)

    그러면 대상 문자열의 모든 항목이 t새 문자열로 대체됩니다 n.

  • gsub(/\n/, k)

    그러면 문자열이 복원됩니다 k.

  • 1

    이것은 awk에게 라인을 인쇄하라고 지시합니다.

관련 정보