2017-10-18 49 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