검색 및 바꾸기가 내 "$1" 토큰을 존중하지 않습니다.

검색 및 바꾸기가 내 "$1" 토큰을 존중하지 않습니다.

Ubuntu 14.04에서 bash 쉘을 사용합니다. 파일의 모든 줄에서 간단한 검색 및 바꾸기를 시도하고 있습니다. 나는 시도했다

perl -pi -e "s/.*/DELETE FROM my_object_times where ID = '$1';/g" ids.csv

하지만 이로 인해 파일이 가득 차게 됩니다.

DELETE FROM my_object_times where ID = '';

내가 캡쳐하고 싶었던 모든 것이 전혀 삽입되지 않았습니다. 이 검색 및 교체를 수행하는 더 좋은 방법은 무엇입니까? 나는 최종 결과가 다음과 같을 것으로 예상했습니다.

DELETE FROM my_object_times where ID = 'abcdef12341234abcdef';

답변1

perl -pi -e "s/.*/DELETE FROM my_object_times where ID = '$1';/g" ids.csv

Perl 조각이 큰따옴표로 묶여 있으므로 쉘은 $1현재 값이 무엇이든(아마도 비어 있거나 설정되지 않은 경우) 확장됩니다. 이를 방지하려면 달러 기호를 이스케이프 처리해야 합니다. 또한 s///연산자 패턴에 캡처 그룹이 없으므로 $1아무것도 포함되지 않습니다. ( perl -w또는 use warnings이에 대해 경고합니다.)

패턴에 괄호를 추가하거나 $&. 또한 전역 대체는 너비가 0일 수 있는 패턴에서는 제대로 작동하지 않는 것 같으므로 g-플래그를 제거하는 것이 좋습니다.

그래서:

perl -w -pe "s/.*/DELETE FROM my_object_times where ID = '\$&';/" 

( &쉘에서는 유효한 변수가 아니므 $&로 그대로 유지됩니다. 그러나 일반적으로 $이스케이프해야 합니다.)

일반적으로 Perl 코드를 작은따옴표로 묶는 것이 더 좋습니다. Perl에서는 달러 기호가 매우 일반적이기 때문입니다. 그러나 Perl 코드 내부의 작은따옴표는 이를 약간 어렵게 만듭니다. 한 가지 옵션은 16진수로 표시하는 것입니다.

perl -w -pe 's/.*/DELETE FROM my_object_times where ID = \x27$&\x27;/' 

답변2

이렇게 하면 됩니다:

sed -i "s/.*/DELETE FROM my_object_times where ID = '&';/" ids.csv

관련 정보