假设我有一个这样的输入文件:
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');
答案1
使用awk
而不是sed
:
awk -F"'" '{OFS="'"'"'"; $2=$2+10000; print}'
答案2
我不知道是否有一种优雅的方法可以用一个命令来完成此操作(我也不这么认为),但您可以轻松地使用每个数字长度的一个命令来完成此操作:
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');
答案3
与以下解决方案相同安斯加·维切斯, 但在perl
:
perl -F\' -lane '$F[1] += 10000; print join "\047", @F' infile
-a
自动分割@F
为'
。-n
循环遍历每一行。
看perlrun(1)
。