sed 또는 awk를 사용하여 특수 문자가 있는 변수를 식별하는 방법은 무엇입니까?

sed 또는 awk를 사용하여 특수 문자가 있는 변수를 식별하는 방법은 무엇입니까?

$ echo "${BASH_VERSION}" 5.1.4(1)-release
Linux 5.18.0-17.1-liquorix-amd64 x86_64 GNU/Linux

문자열이 있고 export LIBVIRT_DEFAULT_URI='qemu:///system'사용자의 문자열에서 전체 행을 찾아 삭제하고 싶습니다 ~/.profile. 나는 좋은 방법을 모른다. sed 또는 awk의 일반적인 사용은 오류와 함께 실패하며 불행히도 나는 문제를 해결하는 방법을 추측하기에는 너무 멍청하거나 너무 게으르다(또는 둘 다).

어디에 $1파일 이름이 있고 $2검색할 문자열이 있습니다. 다음은 일반적으로 작동하지만 어떤 경우에는 실패하는 것 같습니다.

이것은 작동하지 않습니다: awk "!/$2/" "$1" > "$1".tmp && mv "$1".tmp "1"
이것도 작동하지 않습니다: sed -i "/$2/d" $1
이것도 작동하지 않습니다: awk -vLine="$2" "!index($0,$2)" file

모든 제안 및/또는 지시에 감사드립니다. 꼭 필요한 경우가 아니라면 Perl을 사용하고 싶지는 않지만 이 시점에서는 효과가 있는 쓴 약을 복용하겠습니다. 감사해요.

답변1

#! /bin/sh -
if [ "$#" -ge 2 ]; then
  export LINE="${1?}"
  shift
  perl -ni -e 'print unless index($_, $ENV{LINE}) >= 0' -- "$@"
fi

다음과 같이 사용하세요:

that-script "export LIBVIRT_DEFAULT_URI='qemu:///system'" file1 file2...

export LIBVIRT_DEFAULT_URI='qemu:///system'from 을 포함하는 행을 삭제하려면 file1,file2...

index($_, $ENV{LINE}) >= 0선택적 선행 공백 또는 후행 공백으로 구성된 행을 m{^\s*\Q$ENV{LINE}\E\s*$}일치시키는 데 사용할 수 있습니다 .export LIBVIRT_DEFAULT_URI='qemu:///system'

관련 정보