我在文件中有以下数据:
@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,
谢谢!
答案 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],
以匹配从00
到17
的年份,20
将被添加到其中
[7-9][0-9],
以匹配从70
到99
的{{1}}之前的年份
输出
19