sed : 첫 번째 숫자 범위 만 교체 ’29’); INSERT INTO

다음과 같은 입력 파일이 있다고 상상해보십시오.

INSERT INTO video_item_theme VALUES('9', '29');
INSERT INTO video_item_theme VALUES('19', '312');
INSERT INTO video_item_theme VALUES('414', '1');

그리고 첫 번째 범위에만 10000을 더하고 싶습니다. 그래서 다음과 같이 끝납니다.

INSERT INTO video_item_theme VALUES('10009', '29');
INSERT INTO video_item_theme VALUES('10019', '312');
INSERT INTO video_item_theme VALUES('10414', '1');

내 접근 방식은 “1000”을 한 자리 숫자, “100”으로 시작하는 것입니다.

sed 's/[0-9]\{2\}/10&/g'

… 첫 번째 숫자뿐만 아니라 두 숫자의 각 발생을 변경하기 때문에별로 도움이되지 않습니다.

INSERT INTO video_item_theme VALUES('9', '10029');
INSERT INTO video_item_theme VALUES('10019', '100312');
INSERT INTO video_item_theme VALUES('100414', '1');


답변

awk대신에 사용하십시오 sed:

awk -F"'" '{OFS="'"'"'"; $2=$2+10000; print}'

답변

나는 하나의 명령으로 그것을하는 우아한 방법이 있는지 모르겠지만 (그리고 그렇게 생각하지는 않습니다), 숫자 길이 당 하나의 명령으로 쉽게 할 수 있습니다 :

sed -e "s/'\([0-9]\{1\}\)',/\'1000\1\',/g"
sed -e "s/'\([0-9]\{2\}\)',/\'100\1\',/g"
sed -e "s/'\([0-9]\{3\}\)',/\'10\1\',/g"

원하는 숫자 만 변경하는 요령은 패턴에 컨텍스트 (예 : 작은 따옴표와 쉼표)를 포함시켜 패턴이 문자열에서 고유하도록하는 것입니다.

각 명령의 결과는 다음과 같습니다.

$ sed -e "s/'\([0-9]\{1\}\)',/\'1000\1\',/g" test
INSERT INTO video_item_theme VALUES('10009', '29');
INSERT INTO video_item_theme VALUES('19', '312');
INSERT INTO video_item_theme VALUES('414', '1');

$ sed -e "s/'\([0-9]\{2\}\)',/\'100\1\',/g" test
INSERT INTO video_item_theme VALUES('9', '29');
INSERT INTO video_item_theme VALUES('10019', '312');
INSERT INTO video_item_theme VALUES('414', '1');

$ sed -e "s/'\([0-9]\{3\}\)',/\'10\1\',/g" test
INSERT INTO video_item_theme VALUES('9', '29');
INSERT INTO video_item_theme VALUES('19', '312');
INSERT INTO video_item_theme VALUES('10414', '1');

답변

Ansgar Wiechers 와 동일한 솔루션 이지만 다음과 perl같습니다.

perl -F\' -lane '$F[1] += 10000; print join "\047", @F' infile
  • -a로 자동 분할 @F에서 '.
  • -n 각 줄을 반복합니다.

참조하십시오 perlrun(1).