sed에서 여러 번 재사용하기 위해 복잡한 정규식을 저장하는 방법은 무엇입니까?

sed에서 여러 번 재사용하기 위해 복잡한 정규식을 저장하는 방법은 무엇입니까?

사용 중에는 sed파일에서 두 번 일치해야 하는 상당히 복잡한 정규식을 만드는 경우가 많습니다. 이 정규식을 저장하고 두 번만 참조할 수 있는 방법이 있습니까?

어쩌면 이렇게 생긴 게 있지 않을까요?

sed ' complicated_regex=/^(([a-f0-9]{32})+([a-zA-Z0-9=]{{$i}})?)+$/
s/complicated_regex:complicated_regex/simple-output/
' my_file

업데이트: 답변은 bash 변수를 사용하는 솔루션을 제안합니다. 이것은 작동하지 않습니다. 주어진 test.txt.

#test.txt
foo bar
bar foo

그리고 스크립트

#!/bin/bash

VALUE='foo \([a-z]\+\)'

sed 's/"${VALUE}"/foo happy \1/' test.txt

이렇게 하면 출력이 생성됩니다.

foo happy bar
bar foo

그런데 오류가 났어요

sed: -e expression #1, char 24: invalid reference \1 on `s' command's RHS

답변1

쉘 변수를 사용할 수 있습니다.

complicated_regex='(([a-f0-9]{32})+([a-zA-Z0-9=]{{$i}})?)+'
sed s/^"$complicated_regex":"$complicated_regex"\$/'simple-output'/ my_file

무슨 뜻인지 잘 모르겠지만 $i작은따옴표 밖에 넣어야 할 것 같습니다.

complicated_regex='(([a-f0-9]{32})+([a-zA-Z0-9=]{{'"$i"'}})?)+'

답변2

스크립트의 나머지 부분에서 백슬래시 이스케이프가 어떻게 변경되어야 하는지 걱정하지 않고 쉘 변수 값을 입력하는 sed가장 쉬운 방법 sed은 모든 것을 작은따옴표로 묶는 것입니다.와는 별개로변수를 큰따옴표로 묶습니다.

아래의 모든 코드 예제는 다음을 가정합니다.VALUE='foo \([a-z]\+\)'

다음과 같은부서진변수가 VALUE확장되지 않았기 때문에 코드가 실패합니다.

sed 's/"${VALUE}"/foo happy \1/' test.txt

다음과 같은부서진백슬래시가 쉘에 표시되기 전에 쉘에서 먹기 때문에 코드가 실패합니다 \1(작은따옴표 대신 큰따옴표로 묶여 있기 때문입니다) sed.

sed "s/${VALUE}/foo happy \1/" test.txt

다음 코드는 예상대로 작동합니다.

sed 's/'"${VALUE}"'/foo happy \1/' test.txt

다음 코드도 작동합니다.

sed "s/${VALUE}/foo happy \\1/" test.txt

다음도 마찬가지입니다.

sed s/"${VALUE}"/foo\ happy\ \\1/ test.txt

그런데 왜 복잡해지나요? 스크립트 주위의 작은따옴표는 sed특히 코드를 읽는 비쉘 스크립팅 전문가의 경우 모든 것을 더 명확하게 만듭니다. 내가 가장 좋아하는 방법은 변수 확장을 위해 작은따옴표에서 큰따옴표로 이동한 다음 작은따옴표로 바로 돌아가는 것입니다.

sed 's/'"${VALUE}"'/foo happy \1/' test.txt

관련 정보