在OSX上找到sed grep insert和replace

时间:2014-12-04 01:37:27

标签: sed grep find

我需要编辑大量文件,它们看起来像这样:

[COURSE HEADER]
VERSION = 0
UNITS = ENGLISH
DESCRIPTION = workout #19
FILE NAME = none
MINUTES FTP
[END COURSE HEADER]
...

我需要对这些文件进行一些操作(它们都位于同一个文件夹中),首先必须将版本从0更新为2,文件名应替换为当前文件的真实文件名正在处理,我需要插入一个包含“FTP = 100”的新行,我需要从这行“MINUTES FTP”(MINUTES<tab>FTP)替换单词FTP。

所以看起来应该是这样的:

[COURSE HEADER]
VERSION = 2
UNITS = ENGLISH
DESCRIPTION = workout #19
FILE NAME = workout19.erg
FTP=100
MINUTES  WATTS
[END COURSE HEADER]
...

1 个答案:

答案 0 :(得分:0)

由于您拥有同一文件夹中的所有文件,您可以使用简单的for循环执行此操作,并使用多个逗号(-e optionsed每个文件一行:

for FILE in *; do
    sed -i.bak -e "s_\(VERSION = \)0_\12_" -e "/FILE NAME = none/{
        r"<(echo "FILE NAME = $FILE"; echo FTP=100)"
        d
    }" -e "s_\(MINUTES\)\tFTP_\1\tWATTS_" "$FILE"
done

此处sed每行执行三次替换:

  • s_\(VERSION = \)0_\12_
  • "/FILE NAME = none/{ r"<(echo "FILE NAME = $FILE"; echo FTP=100)" d }"
  • s_\(MINUTES\)\tFTP_\1\tWATTS_

请注意使用Backreferences\(...\))来记住模式。在第一个命令中,\12表示后引用\1后跟字符2(记住的模式从 0 9 ) 。

在第二句中,我认为避免对$FILE字符进行错误解释的最佳方法是让process substitution读取r command并删除d command的旧模式。


实施例

$ cat Centennial\ T90-TSS107IF0.84.ergn 
[COURSE HEADER]
VERSION = 0
UNITS = ENGLISH
DESCRIPTION = 20 Minute Test,90,80.
FILE NAME = none
MINUTES FTP
[END COURSE HEADER]

[COURSE DATA]
0   40
10  65
10  100
11  100
11  65
12  65
12  105
13  105
13  65
14  65
14  110
15  110
15  65
20  65
20  90
20.5    110
20.5    110
25  110
25  50
30  50
30  95
32  107
32  107
50  107
50  30
55  50
55  50
60  30
[END COURSE DATA]

$ for FILE in *; do
>     sed -e "s_\(VERSION = \)0_\12_" -e "/FILE NAME = none/{
>         r"<(echo "FILE NAME = $FILE"; echo FTP=100)"
>         d
>     }" -e "s_\(MINUTES\)\tFTP_\1\tWATTS_" "$FILE"
> done
[COURSE HEADER]
VERSION = 2
UNITS = ENGLISH
DESCRIPTION = 20 Minute Test,90,80.
FILE NAME = Centennial T90-TSS107IF0.84.ergn
FTP=100
MINUTES WATTS
[END COURSE HEADER]

[COURSE DATA]
0   40
10  65
10  100
11  100
11  65
12  65
12  105
13  105
13  65
14  65
14  110
15  110
15  65
20  65
20  90
20.5    110
20.5    110
25  110
25  50
30  50
30  95
32  107
32  107
50  107
50  30
55  50
55  50
60  30
[END COURSE DATA]