앰퍼샌드 (&)와 함께 sed 사용


19

sed를 사용하여 패턴을 개별적으로 변경하지 않고 SAS 파일 내에서 패턴을 찾아서 바꾸고 있습니다. 문제는 매크로 변수를 바꾸려고하는데 앰퍼샌드를 사용할 때 올바르게 처리되지 않습니다.

Here's my code:
sed -ie 's/user=&uid./user=&sysuserid./g' *_table_*.sas

이 명령을 실행할 때마다 원본 텍스트로 모든 종류의 펑키 한 것들을 추가하고 수행하는 것처럼 보입니다.

질문 : 앰퍼샌드가 포함 된 텍스트를 sed 명령으로 바꾸려면 어떻게합니까?


6
&특수 문자이므로 RHS에서 사용될 때 's/user=&uid./user=\&sysuserid./g'이스케이프 처리해야합니다. 실제 문자가 필요하므로 LHS에서 점을 이스케이프해야 문자 그대로 일치해야합니다's/user=&uid\./user=\&sysuserid./g'
don_crissti

1
예, 오른쪽의 '&'는 기본적으로 "왼쪽에 일치하는 모든 것"을 의미하므로 '\'로 이스케이프하십시오. 당신은 단지 의견이 아니라 그 대답을해야합니다.
Edward Falk

나는 첫 번째 기간을 탈출 할 필요가 없었습니다 ... 다른 사람의 머리 만 궁금해했습니다 :)
lucasdavis500

답변:


25

&대체 텍스트에서 특별합니다. "패턴과 일치하는 입력의 전체 부분"을 의미하므로 여기서 수행중인 작업은로 대체 user=&uidX됩니다 user=user=&uidXsysuserid.. 대체 텍스트에 실제 앰퍼샌드를 삽입하려면을 사용하십시오 \&.

.검색 패턴에서 다른 문자는 개행 문자를 제외한 모든 문자를 나타내지 만 .대체 텍스트의 끝에는 리터럴 도트 라는 잘못된 점이 있습니다. 리터럴 문자열 만 바꾸려면 백 슬래시로 user=&uid.보호하십시오 ..

sed -e 's/user=&uid\./user=\&sysuserid./g'

한 문자를 바꾸고 결과를 유지하려면 해당 문자를 그룹 \1에 넣고 대체에 사용하여 해당 그룹을 참조하십시오.

sed -e 's/user=&uid\(.\)/user=\&sysuserid\1/g'

실제로 원본 텍스트와 대체 텍스트가 반복되면 어쨌든 그룹을 사용해야합니다.

sed -e 's/\(user=&\)u\(id\.\)/\1sysuser\2/g'

즉 "대체 u에 의해 sysuser사이 user=&id.".


당신은 그룹을 설명 할 수 있습니까?
lucasdavis500

2
@ lucasdavis500 그룹은 패턴의 일부를 식별합니다. 백 슬래시 괄호로 구분됩니다. 예를 들어 , 일치 문자열을 그룹 (패턴의 첫 번째 그룹이므로 그룹 번호 1)으로 \(user=&\)일치 user&시키고 저장하는 패턴이 있습니다. 그런 다음 교체 \1에서 그룹 번호 1에 저장된 문자열로 대체됩니다.
Gilles 'SO-stop

(사용자 = &) 사용자 =가 아니라 사용자 = &를 저장한다는 의미입니까?
lucasdavis500

@ lucasdavis500 귀하의 의견을 이해하지 못합니다. 문자 =정규 표현식과 대체 텍스트는 그래서, 그 자체를 의미 user=&만 일치 user=&하고, user=&대체 텍스트의 수율로 user=정규식 일치 라인의 일부 하였다.
Gilles 'SO- 악마 그만해'

1
@ lucasdavis500 =캐릭터는 특별한 의미가 없습니다. user=&대체 텍스트 user=에서 원래 일치하는 텍스트가 생성 됩니다. user=\&대체 텍스트에서user=&
Gilles 'SO-stop
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.