sed 정규식 문제

sed 정규식 문제

파일의 문자열을 바꾸려고 합니다.

$RELEASE     = '1234';

RELEASE와 = 기호 사이의 공백은 공백이나 탭 문자일 수 있습니다. 버전 번호 주위의 따옴표는 작은따옴표나 큰따옴표일 수 있습니다.

나는 현재 공백과 작은 따옴표가 작동하도록 가정하고 있습니다.

sed 's/$RELEASE[[:space:]]*\=[[:space:]]*'\''[0-9]*'\'';/$RELEASE = '\''1234'\'';/g' config.ini > config.ini

그래서 많은 작업 후에 이것이 작동합니다. 그러나 문자열이 공백(탭과 반대)이고 작은따옴표가 큰따옴표와 반대인 경우에만 해당됩니다. 탭을 수정하기 위해 지금까지 시도한 작업은 다음과 같습니다.

sed 's/$RELEASE([[:space:]]|\t)*\=([[:space:]]|\t)*'\''[0-9]*'\'';/$RELEASE = '\''1234'\'';/g' config.ini > config.ini

방금 대부분의 sed 정규 표현식이 /t를 지원하지 않는다는 내용을 읽었습니다. 이것이 사실입니까? [[:tab:]] 유형 대체가 있습니까? (나는 노력했다)

어떤 도움이라도 대단히 감사하겠습니다.

답변1

나는 아무런 문제가 없습니다 [[:space:]]. 다음은 공백과 탭의 혼합 교체를 보여주는 매우 어리석은 작은 예입니다.

$ echo -e 'A \t \t B' | sed 's/A[[:space:]]*B/WORKED/'
WORKED

더 짧기 때문에 \s일반적으로 큰 문자열에 더 적합한 방법을 사용할 수도 있습니다 .sed

$ echo -e 'A \t \t B' | sed 's/A\s*B/WORKED/'
WORKED

어쨌든, 실제 문제는 그 귀찮은 작은 따옴표를 피하는 것이라고 생각합니다. 내가 찾은 가장 쉬운 방법은 작은 따옴표로 묶인 문자열을 나누고 작은 따옴표에 큰 따옴표를 사용한 다음 (필요한 경우) 작은 따옴표로 묶인 줄을 반환하는 것입니다. Bash는 모든 것을 자동으로 연결해 줍니다.

$ echo 'This is a nice string and this is a single quote:'"'"' Nice?'
This is a nice string and this is a single quote:' Nice?

따라서 우리가 절약한 모든 공간은 \s이 거대한 인용 상황으로 인해 파괴될 것입니다.

$ echo -e '$RELEASE  \t = '"'"'1234'"'"';' |\
  sed 's/$RELEASE\s*=\s*'"'"'[0-9]*'"'"'\;/REPLACEMENT/'

$RELEASE[\s=]+물론, (이것은 PHP 스크립트처럼 보이기 때문에) 줄이 로 시작하면 전체 줄을 바꿀 수 있다고 가정할 수 있다는 주장이 있습니다 . 분명히 이것이 항상 그런 것은 아니지만(전체 응용 프로그램이 하나의 보기 흉한 줄일 수 있음) 검색 및 교체가 더 즐거워집니다.

sed 's/$RELEASE[\s=]*.*/REPLACEMENT/'

예, 일반적인 sed사용 규칙이 적용됩니다. 스트림 편집기(예: sed)에 에코를 표시하지 말고 파일로 다시 리디렉션하세요.만약에작동하며 파일을 쉽게 손상시킬 수 있습니다.

매개변수를 사용 하거나 -i(에 적용 sed) Sponge와 같은 애플리케이션에 입력을 파이프합니다(지연된 출력과 유사).

sed -i '...' file
sed '...' file | sponge file

답변2

\1표현식을 그룹화하고 그룹을 가리키는 데 사용할 수 있습니다 . 예를 들어

sed 's/^\($RELEASE.*=\).*/\1 '"'1234'"'/' config.ini

관련 정보