Sed Regexp 명령이 작동하지 않습니다

Sed Regexp 명령이 작동하지 않습니다

그래서 파일에 다음과 같은 줄이 있습니다.

#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

관련 정보