sed:仅替换第一个数字范围

sed:仅替换第一个数字范围

假设我有一个这样的输入文件:

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)

相关内容