스크립트 내에서 파일 이름이 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에서 변수를 인용하는 방법에 대한 자세한 내용은 여기를 참조하세요.링크