具体搜索并用sed替换

时间:2017-10-18 09:24:27

标签: string sed

我在文件中有以下数据:

@ARTICLE{Abazajian03,
   year = 2003,
   volume = 203,
   volume = 203,
@ARTICLE{Alexander03,
   year = 2003,
@ARTICLE{Anderson03,
   year = 2003,
@INPROCEEDINGS{Antonucci03,
   year = 2003,
@ARTICLE{Baes03,
   year = 2003,
   year = 2003,
....

并想要改变“名称和日期”,例如Abazajian03到Abazajian2003,Alexander03到Alexander2003等。

这条线差不多了,我觉得sed可以做到这一点

sed 's/[a-z][A-Z]*03/2003/' infile.txt > outfile.txt

但是在替换(!!)中取消最后一个alpha-charterer,例如 @ARTICLE {Abazajia2003,

谢谢!

3 个答案:

答案 0 :(得分:1)

Awk 解决方案:

awk '/^@/{ sub(/03/,"2003") }1' infile.txt

输出(用于当前输入):

@ARTICLE{Abazajian2003,
   year = 2017,
   volume = 203,
   volume = 203,
@ARTICLE{Alexander2003,
   year = 2017,
@ARTICLE{Anderson2003,
   year = 2017,
@INPROCEEDINGS{Antonucci2003,
   year = 2017,
@ARTICLE{Baes2003,
   year = 2017,
   year = 2017,

答案 1 :(得分:0)

sed '/^@/ {s/\([0-6][0-9]\)/20\1/;s/\([7-9][0-9]\)/19\1/}' infile.txt > outfile.txt

简要说明,

  • /^@/:与正则表达式匹配的处理行' ^ @'
  • s/\([0-6][0-9]\)/20\1/:替换' [0-6] [0-9]'前缀为' 20' \1是指括号所包含的相应匹配
  • s/\([7-9][0-9]\)/19\1/:替换' [7-9] [0-9]'用' 19'作为前缀\1是指括号所包含的相应匹配

答案 2 :(得分:0)

使用 sed

sed -r 's/(^@.*)([0-1][0-9],)/\120\2/g; s/(^@.*)([7-9][0-9],)/\119\2/g;'

了解它的工作原理: 我们从@开始为每一行捕获两个组 例如。对于输入中的第一行:03,之前的一个组和第二个03,本身。然后我们将其替换为first_group 20 second_group

[0-1][0-9],以匹配从0017的年份,20将被添加到其中 [7-9][0-9],以匹配从7099的{​​{1}}之前的年份

输出

19