sed에서 일련의 문자 간격을 지정하는 방법은 무엇입니까?

sed에서 일련의 문자 간격을 지정하는 방법은 무엇입니까?

저는 정규식을 처음 접했고 몇 가지 좌절감을 느꼈습니다. 디렉터리를 나타내는 문자열을 사용하려고 하는데 다음을 실행하여 문제를 재현할 수 있습니다.

echo "a" | sed "s/a/home/books/examples/file/g"

다음과 같이 sed 명령의 대체 부분을 \Q 및 \E로 래핑하여 이스케이프를 시도했습니다.

echo "a" | sed "s/a/\Qhome/books/examples/file\E/g"

또한 확장 정규식을 활성화하기 위해 두 명령에 -r 플래그를 전달하려고 시도했지만 그게 문제라고 생각하지 않습니다.

편집: 문제는 sed가 경로의 일부 문자를 특수 정규식 문자로 해석하므로 이스케이프하고 싶지만 하나씩 이스케이프할 수 없다는 것입니다. 위에서 설명한 시퀀스를 이스케이프하는 방법은 작동하지 않습니다.

개별 문자를 이스케이프하는 것이 가능하다는 것을 알고 있지만 이러한 문자열 중 많은 부분이 변수를 통해 액세스되고 이러한 대체 자체를 수행하려면 또 다른 유사한 sed 명령이 필요하기 때문에 그것은 작동하지 않습니다!

이 명령을 쉘 스크립트에서 실행할 계획입니다.

답변1

sed에서는 각 문자에 백슬래시를 수동으로 추가하거나 다른 구분 기호로 전환해야 합니다. 문자열이 동적이고 사용자로부터 제공된 경우 어떤 문자가 안전한지 결코 알 수 없습니다. 당신은 다음과 같은 것을 할 수 있습니다

s=${s//'\'/'\\'}
s=${s//'/'/'\/'}
sed "s/$s/replacement/g"

bash에서는 Perl로 전환하는 것이 더 쉽습니다. Perl에서는 다음 \Q...\E구문을 사용하여 하위 문자열을 인용할 수 있습니다.

perl -pe 's/\Q$ARGV[1]\E/replacement/g' "$s"

관련 정보