검색 및 바꾸기가 내 "$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

관련 정보