查找和替换限于特定列(单行)

时间:2016-01-22 22:25:12

标签: regex string perl

是否有办法(在一行内)将查找和替换限制在制表符分隔的.txt文件的特定列中?

例如:

perl -pe 's/A/B/g;'

但是只发现并替换了A'用' B'在第2列中并忽略A的所有其他实例,转换为:

1   A   A2
2   A   A
3   B   B1
4   A   B
5   A   A
6   B   A3
7   A   A
8   C   A
9   E   B
10  D   B
11  A   C6
12  A   G
13  B   L
14  A   E
15  B   A
16  A   A

分为:

1   B   A2
2   B   A
3   B   B1
4   B   B
5   B   A
6   B   A3
7   B   A
8   C   A
9   E   B
10  D   B
11  B   C6
12  B   G
13  B   L
14  B   E
15  B   A
16  B   A

3 个答案:

答案 0 :(得分:2)

这样的东西会变换制表符分隔行的第二个字段。

perl -lne '@row = split /\t/; $row[1] =~ s/A/B/; print join ( "\t", @row );' 

答案 1 :(得分:2)

你可以这样写:

perl -lane '$F[1]=~tr/A/B/;print join("\t", @F)' file

答案 2 :(得分:1)

a sed one-liner

$ sed 'h;s/^.*\t\(.*\)\t.*$/\1/;y/A/B/;G;s/\(.*\)\n\(.*\t\).*\(\t.*\)/\2\1\3/' infile
1       B       A2
2       B       A
3       B       B1
4       B       B
5       B       A
6       B       A3
7       B       A
8       C       A
9       E       B
10      D       B
11      B       C6
12      B       G
13      B       L
14      B       E
15      B       A
16      B       A

说明:

# Copy pattern space to hold space
h

# Remove first and third column from pattern space
s/^.*\t\(.*\)\t.*$/\1/

# Transliterate A to B (can use s/// for more complex substitutions)
y/A/B/

# Append hold space to pattern space
G

# Replace second column with transliterated value
s/\(.*\)\n\(.*\t\).*\(\t.*\)/\2\1\3/

无sed替代

$ paste <(cut -f 1 infile) <(cut -f 2 infile | tr A B) <(cut -f 3 infile)

这会使用pastecuttr进行流程替换。当然,tr可以替换为更复杂的更改的替代品。