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
简要说明
:与正则表达式“^@”匹配的处理行/^@/
:将“[0-6][0-9]”前缀替换为“20”,而s/\([0-6][0-9]\)/20\1/
指括号中包含的相应匹配\1
:将“[7-9][0-9]”替换为前缀为“19”,而s/\([7-9][0-9]\)/19\1/
指括号中包含的相应匹配\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,