사용 중에는 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