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