String 特定搜索并替换为sed

String 特定搜索并替换为sed,string,sed,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 = 200

我的文件中包含以下数据:

@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 's/[a-z][A-Z]*03/2003/' infile.txt > outfile.txt
但是在替换中取消最后一个alpha租船人(!!),例如。 @第{条2003年

谢谢

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

    • Awk解决方案:

      awk '/^@/{ sub(/03/,"2003") }1' infile.txt
      
      输出(对于当前输入):


      使用sed

      sed -r 's/(^@.*)([0-1][0-9],)/\120\2/g; s/(^@.*)([7-9][0-9],)/\119\2/g;'
      
      要了解其工作原理,请执行以下操作: 我们从
      @

      例如,对于输入的第一行:一组在
      03,
      之前,另一组在
      03,
      之前。然后我们将其替换为第一组
      20
      第二组

      [0-1][0-9],
      以匹配从
      00
      17
      的年份,其中
      20
      将作为前缀
      [7-9][0-9],
      以匹配从
      70
      99
      的年份,其中
      19
      将作为前缀

      输出:

      @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,
      

      这看起来确实应该起作用,但我得到了一个:sed:1:“/^@/{s/([0-6][0-9])/…”:替换命令中的错误标志:'}'错误这是说::sed:非法选项--r@npross似乎您正在使用BSD sed…尝试使用
      -E
      而不是
      -r
      ,然后告诉我它是否有效。啊,不,不完全正确。我不想随意添加“year=2017”对此,只需将@ARTICLE中的最后两个字符从03改为2003即可。@npross,那你为什么写得这么理想呢?我想在你的问题中一次性完成所有年份,例如从1970年到2017年?更新你的描述,因为我有一个从AUTHOR70到AUTHOR17的@ARTICLES列表,我想将它们全部改为AUTHOR1970到authorR2017.问题的最后一行令人困惑,我已经删除了。但我确实认为sed,而不是awk,才是解决问题的方法。好吧,酷。这很有效,因为我不得不这么做:awk'/^@/{sub(/00/,“2000”)sub(/01/,“2001”)…sub(/17/,“2017”)}1'infle.txt多年来,但它完成了任务。
      @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,