2017-10-18 43 views
1

我有一个文件中的以下数据:特定的搜索,取而代之的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 

但起飞的最后一个字母承租人在更换(!!)如 @ARTICLE {Abazajia2003,

谢谢!

回答

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, 
+0

Ahhh,不,不是。我不希望为此添加“年= 2017”;只需更改@ARTICLE中的最后两个字符即可。 03至2003. – npross

+0

@npross,那么你为什么写*理想情况下,我想要做所有年份,例如大约1970年至2017年一次去*在你的问题?更新你的描述 – RomanPerekhrest

+0

因为我有一个@ARTICLES的列表,范围从AUTHOR70到AUTHOR17,并且想把它们全部更改为AUTHOR1970到AUTHOR2017。问题的最后一行令人困惑,我已将其删除。但我确实认为sed,而不是awk,是去这里的路。 – npross

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指的是括号中包含的相应匹配
+0

这看起来好像它应该工作,但我是ge ':'/^@/{s/\([0-6] [0-9] \)/ ...“:替代命令中的坏标志:'}' 错误 – npross

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],匹配年内001720将预置
[7-9][0-9],匹配年内709919将预置

输出:

@ARTICLE{Abazajian2003, 
    year = 2003, 
    volume = 203, 
    volume = 203, 
@ARTICLE{Alexander2003, 
    year = 2003, 
@ARTICLE{Anderson2003, 
    year = 2003, 
@INPROCEEDINGS{Antonucci2003, 
    year = 2003, 
@ARTICLE{Baes2003, 
    year = 2003, 
    year = 2003, 
+0

这是说:: sed:非法选项 - r – npross

+0

@npross好像你在使用BSD sed ...试用'-E'而不是'-r'并让我知道它是否有效。 – batMan