![Sed Regexp 명령이 작동하지 않습니다](https://linux55.com/image/166997/Sed%20Regexp%20%EB%AA%85%EB%A0%B9%EC%9D%B4%20%EC%9E%91%EB%8F%99%ED%95%98%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4.png)
그래서 파일에 다음과 같은 줄이 있습니다.
#multiline.pattern: ^\[
나는 그것을 대체하기 위해 sed를 사용해 보았습니다.
multiline.pattern: '^\['
이 작업을 수행하는 데 사용하는 명령은 다음과 같습니다.
sudo sed -i 's/multiline.pattern: \^\\\[/multiline.pattern: '\'\^\\\\[\'/g' /etc/filename.txt
하지만 이 명령을 실행할 때마다 다음과 같은 결과가 나타납니다.
누군가 내가 여기서 뭘 잘못하고 있는지 말해 줄 수 있습니까?
감사해요!
답변1
귀하의 예를 고려하면 다음과 같이 작동합니다.
$ cat ex
#multiline.pattern: ^\[
$ sed -e "s/^#multiline\.pattern:.*/multiline.pattern: '^\\\['/" ex
multiline.pattern: '^\['
#multiline.pattern:
이렇게 하면 로 시작하는 줄과 줄 끝까지 원하는 수의 문자가 나오는 줄이 원하는 패턴으로 대체됩니다.
당신이 추구하는 패턴에는 몇 가지 특수 기호( \
, [
)가 포함되어 있는데, 이를 추가 기호로 이스케이프 처리했습니다 \
(예: \\
give you a literal \
,
\[
give you a literal [
).
답변2
이 문제를 해결할 수 있습니다.sed "s@\^@\'\^@;s/$/\'/"
$ cat > toto
#multiline.pattern: ^\[
$ sed "s@\^@\'\^@;s/$/\'/" toto
#multiline.pattern: '^\['
아이디어는 정규식을 단순화하기 위해 두 번의 연속 작업에서 " ^
by '^
"를 "줄 끝"으로 바꾼 다음 "줄 끝"을 "줄 끝"으로 바꾸는 것입니다.'
물론 sed -i ...
파일을 수정하는 데 사용하십시오.
답변3
잘못된 점은 마지막 부분입니다.선두:
sed 's/multiline.pattern: \^\\\[/multiline.pattern: '\'\^\\\\[\'/g'
# ^ ^ ^ ?
마지막 부분은 backslash
다른 작은따옴표가 끝날 때까지 이스케이프 됩니다.열려 있는. 이것이 바로 인용문이 다른 인용문으로 끝날 때까지 더 입력할 수 있는 프롬프트가 bash
제공되는 이유입니다.$PS2
>
'
마지막 것을 제거 '
하면 작동합니다.
sed 's/multiline.pattern: \^\\\[/multiline.pattern: '\'\^\\\\[\'/g
# or:
sed 's/multiline.pattern: ^\\\[/multiline.pattern: '"'^\\\['/g"
sed "s/multiline.pattern: ^\\\\\[/multiline.pattern: '^\\\['/g"
sed 's/multiline.pattern: ^\\\[/multiline.pattern: \x27^\\[\x27/g'
반품:
- 예제 출력에서 삭제하려는 것 같습니다
#
. 이렇게 하려면 일치 패턴에 이를 포함시키십시오sed
(원하는 인용 스타일 사용).
sed 's/#multiline...'
- 괄호를 사용하여 패턴의 일부를 "캡처"하여 대체 항목에서 재사용할 수 있습니다(라고 함).하위 표현식 및 역참조):
sed -r 's/#(multiline\.pattern: )(\^\\\[)/\1'\'\\2\'/g
( -r
/를 사용할 --regexp-extended
필요는 없지만 더 읽기 쉽습니다)
sed
오류가 있을 수 있는 파일을 덮어쓰는 대신 출력에서 오류를 확인할 수 있도록 / 옵션 없이 명령을 실행하여 명령이 예상대로 작동하는지 먼저 확인하는 것이 좋습니다 .-i
--in-place