sed를 사용하여 변수에 저장된 파일 이름을 쓰는 방법은 무엇입니까?

sed를 사용하여 변수에 저장된 파일 이름을 쓰는 방법은 무엇입니까?

bash스크립트 에서 sed파일 이름이 bash 변수에 저장된 파일에 어떻게 쓰나요? 한 파일을 내부에서 편집하고 정규식과 일치하는 줄을 다른 파일로 끌어온 다음 첫 번째 파일에서 삭제하려고 하기 때문에 출력 리디렉션이 작동하지 않습니다.

그것은 다음과 같습니다:

sed -i '/^my regex here$/{;w file2;d;}' file1

...하지만 둘 다 실제로 file1어디에 file2있습니까?변하기 쉬운저것잡다파일 이름. (예를 들어 file2=$(mktemp).)

그래서 제가 정말로 원하는 것은 파일 이름의 변수 확장이지만 명령의 나머지 부분은 확장하지 않고 sed전체 내용을 sed단일 인수로 명령에 전달하는 것입니다.

어떤 이유로든 다음은 작동하지 않습니다.

sed -i '/my regex here/{;w '"$file2"';d;}' $file1

"{와 일치하지 않음"이라는 메시지가 표시되는데 그 이유를 이해할 수 없습니다.

내가 할 수 있는 방법이 있나요?

답변1

단일 표현식을 사용하기 때문에 sed(포함) 이후의 모든 내용은w}다음과 같이 해석됩니다.업무 문서이름:

이 매개변수는 wfile편집 명령을 종료해야 합니다.

다음과 같은 두 번째 명령을 추가하면 이를 확인할 수 있습니다 }.

sed -e '/my regex here/{w '"$file2"';d;}' -e '}' $file1

그런 다음 일치하는 줄이 where 확장 된 my regex here파일에 저장됩니다 . 올바른 구문은 별도의 명령을 사용하거나 여러 표현식을 사용하는 것입니다.whatever;d;}whatever$file1

sed -e '/my regex here/{w '"$file1" -e 'd' -e '}' $file2

또는 한 줄에 하나의 명령:

sed '/my regex here/{
w '"$file1"'
d
}
' $file2

답변2

나는 답을 찾았다스택 오버플로"파일 이름이 끝나는 위치를 알기 위해 sed 'w' 명령에 어떻게 지시합니까?"

terdon이 지적했듯이 문제는 변수에 있는 것이 아니지만 중괄호와도 관련이 없습니다. 시도해 보면 sed '/^l/w testing;p'오류가 발생하지 않고 대신에 다음으로 시작하는 모든 줄을 작성한다는 것을 알 수 있습니다. l명명 된 testing;p.

문제는 실제로 파일 이름 뒤에 개행 문자가 누락된 것입니다.

따라서 대답은 sed 명령에서 인라인 줄 바꿈을 사용하는 것입니다.

sed -i '/my regex here/{;w '"$file2"'
d;}' $file1

또는, 더 간결하게 말하면 두 개의 개별 -e매개변수를 사용합니다.

sed -i -e '/my regex here/{;w '"$file2" -e 'd;}' $file1

두 개의 인접한 따옴표가 마음에 들지 않으면(쉽게 무시할 수 있음) 자체 인수에 write 명령을 넣으십시오.

sed -i -e '/^my regex here$/{' -e "w $file2" -e 'd;}' $file1

답변3

sed 명령을 인용하려면 작은따옴표 대신 큰따옴표를 사용하십시오. 그리고 적절한 문자를 이스케이프 처리하는 것을 잊지 마세요.

Bash에서 변수를 참조하는 방법에 대한 자세한 내용은 여기를 참조하세요.협회

관련 정보