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