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

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

스크립트 내에서 파일 이름이 bash 변수에 저장된 파일에 쓰는 데 bash어떻게 사용할 수 있습니까 ? sed하나의 파일을 제자리에서 편집하고 정규식과 일치하는 줄을 다른 파일로 가져와 첫 번째 파일에서 삭제하려고 하기 때문에 출력 리디렉션이 수행되지 않습니다.

다음과 같은 것 :

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 is everything 확장되는 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'보면 오류가 발생하지 않지만 an으로 시작하는 모든 줄을 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에서 변수를 인용하는 방법에 대한 자세한 내용은 여기를 참조하세요.링크

관련 정보