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에서 변수를 참조하는 방법에 대한 자세한 내용은 여기를 참조하세요.협회