다음과 같은 입력 파일이 있다고 상상해보십시오.
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)
.