我需要编辑大量文件,它们看起来像这样:
[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]
...
答案 0 :(得分:0)
由于您拥有同一文件夹中的所有文件,您可以使用简单的for
循环执行此操作,并使用多个逗号(-e
option)sed
每个文件一行:
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]