替换特定列中的空字符串(1行)

时间:2015-11-20 12:37:33

标签: regex perl text

我有一个6列制表符分隔的.txt文件;第6列通常可以包含空字符串:

1   ARS 10  36  .   TTT 
1   ARS 10  36  -   TTT 
1   ARS 10  36  -   TTT 
1   ARS 10  36  -   TTT 
1   ARS 10  36  -   TTT 
1   ARS 10  36  +   TTT 
1   ARS 10  36  +   TTT 
1   ARS 10  36  +   TTT 
1   ARS 10  36  +   TTT 
1   ARS 10  36  +   TTT 
1   ARS 10  36  +   TTT 
1   ARS 10  36  .   TTT 
1   ARS 10  36  -   TTT ARGF10
1   ARS 10  36  -   TTT 

只要$ F [6]为空,我希望插入“DUB”:

1   ARS 10  36  .   TTT DUB
1   ARS 10  36  -   TTT DUB
1   ARS 10  36  -   TTT DUB
1   ARS 10  36  -   TTT DUB
1   ARS 10  36  -   TTT DUB
1   ARS 10  36  +   TTT DUB
1   ARS 10  36  +   TTT DUB
1   ARS 10  36  +   TTT DUB
1   ARS 10  36  +   TTT DUB
1   ARS 10  36  +   TTT DUB
1   ARS 10  36  +   TTT DUB
1   ARS 10  36  .   TTT DUB
1   ARS 10  36  -   TTT ARGF10
1   ARS 10  36  -   TTT DUB

我尝试使用ifelse

来做到这一点
perl -lane '($dub) = "DUB", print "$F[0]\t$F[1]\t$F[2]\t$F[3]\t$F[4]\t$F[5]\t$dub\n" if $F[6] =~ "" else print "$F[0]\t$F[1]\t$F[2]\t$F[3]\t$F[4]\t$F[5]\t$F[6]\n"'

然而,这会返回错误:

syntax error at -e line 1, near """ else"
Execution of -e aborted due to compilation errors.

为什么会这样?我也不确定如何匹配空字符串。

其次,有没有更好的方法在1行内进行有条件的“查找和替换”操作?例如,如果$ F [6]为空,则将$ F [2]的内容替换为“X”。

修改

有没有办法让这个替换有条件?例如只有当第5列='+'时才会这样做:

1   ARS 10  36  .   TTT
1   ARS 10  36  -   TTT
1   ARS 10  36  -   TTT
1   ARS 10  36  -   TTT
1   ARS 10  36  -   TTT
1   ARS 10  36  +   TTT DUB
1   ARS 10  36  +   TTT DUB
1   ARS 10  36  +   TTT DUB
1   ARS 10  36  +   TTT DUB
1   ARS 10  36  +   TTT DUB
1   ARS 10  36  +   TTT DUB
1   ARS 10  36  .   TTT
1   ARS 10  36  -   TTT ARGF10
1   ARS 10  36  -   TTT

3 个答案:

答案 0 :(得分:2)

试试这个(根据需要添加字段分隔符):

 perl -lane '$_.="DUB" unless($F[6]);print'

修改

perl -lane '$_.="DUB" unless $F[6] || $F[4] ne "+";print'

我会说这是为了避免将来混淆:

perl -lane '$_.="DUB" if (!$F[6] and $F[4] eq "+");print'

答案 1 :(得分:1)

perl -lane' BEGIN { $, = "\t" } push @F, "DUB" if @F <6 and $F[4] eq "+"; print @F; ' 将在打印时在列表元素之间添加tab char,

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
RewriteRule ^([a-zA-Z0-9_-]+)$ user.php?u=$1
RewriteRule ^([a-zA-Z0-9_-]+)/user/$ user.php?u=$1

答案 2 :(得分:0)

perl -lane 'print join "\t", @F[0..5], $F[6] ? $F[6] : $f[5] eq "+" ? "DUB" : ""' input.txt