Bash - 如何替换冒号分隔符(:)分隔的行特定字段?

时间:2014-07-08 13:34:13

标签: arrays bash file awk sed

我有一个文件BookDB.txt,它以下列格式存储数据:

Java for dummies:Pauline:10.56:4:3
Bash for dummies:David:10.45:4:5
PHP for dummies:Frederich:10.67:4:4
Perl for dummies:Pearlyn:10.56:4:5
C++ for dummies:Jared:10.46:4:5

如果我想说,用“傻瓜的任何东西”替换第四行的第一个字段,这样文件看起来就像下面一样,我该怎么做?

Java for dummies:Pauline:10.56:4:3
Bash for dummies:David:10.45:4:5
PHP for dummies:Frederich:10.67:4:4
anything for dummies:Pearlyn:10.56:4:5
C++ for dummies:Jared:10.46:4:5

我在这个问题上尝试过其他人提供的片段,但是第一个字段中的空白给了我一些问题:

sed replace in-line a specific column number value at a specific line number

3 个答案:

答案 0 :(得分:3)

使用awk您可以使用字段分隔符:并定位特定的行和列:

awk -F: 'NR==4{$1="anything for dummies"}1' OFS=: file
Java for dummies:Pauline:10.56:4:3
Bash for dummies:David:10.45:4:5
PHP for dummies:Frederich:10.67:4:4
anything for dummies:Pearlyn:10.56:4:5
C++ for dummies:Jared:10.46:4:5

答案 1 :(得分:1)

如果你正在使用sed,你可能需要引用你的表达:

sed 's|^Perl for dummies|anything for dummies|' your_file

输出:

Java for dummies:Pauline:10.56:4:3
Bash for dummies:David:10.45:4:5
PHP for dummies:Frederich:10.67:4:4
anything for dummies:Pearlyn:10.56:4:5
C++ for dummies:Jared:10.46:4:5

在开头添加-i选项会直接改变文件。

如果您的sed支持它,我建议您使用-E-r,因为它更容易。在这里你需要引用()与\:s:

sed -E 's|^Perl( for dummies)|anything\1|' your_file

该命令提供相同的输出/结果。

答案 2 :(得分:0)

如果您想在第4行进行更换:

sed '4s/[^:]*:/anything for dummies:/' input

如果您想要替换匹配'Perl for dummies':

sed '/^Perl/s//anything/' input