如何替换最后一次出现的字符?

如何替换最后一次出现的字符?

我有一个由如下行组成的文件:

199240050;0180209199240050;0
199240241;0180209199240241;0
199240207;0180209199240207;0
199240400;0180209199240400;0

如果最后一个数字是“0”,我应该用“Active”替换它,如果它是“1”,我应该用“Inactive”替换。

我尝试过,sed但行中间出现的“;0”也发生了变化。

它应该在 Linux bash 脚本中使用。


我试过DopeGhoti 给出的解决方案但它失败了:

$ sed 's/0$/active/;s/1$/inactive/'  myLines.txt
800600346                078136521                       active

而输入文件的格式不应改变。

第二种解决方案在末尾附加“;active”,而不替换:

$ awk -F\; 'BEGIN {OFS=";"} { if( $3 == 1 ) { print $1,$2,"inactive" } else { print $1,$2,"active" } }'  myLines.txt
800010654                0295445503                     0;;active

乔治·瓦西里乌也失败:

$ awk '$NF?$NF="active":$NF="inactive"' FS=';' OFS=';' myLines.txt
active
active
active
active

答案1

对于名为 的文件中的给定数据input

$ awk -F\; 'BEGIN {OFS=";"} { if( $3 == 1 ) { print $1,$2,"inactive" } else { print $1,$2,"active" } }' input
199240050;0180209199240050;active
199240241;0180209199240241;active
199240207;0180209199240207;active
199240400;0180209199240400;active

或者,使用sed

$ sed 's/\;0$/active/;s/\;1$/inactive/' input
199240050;0180209199240050;active
199240241;0180209199240241;active
199240207;0180209199240207;active
199240400;0180209199240400;active

答案2

又一个 awk,更惯用:

$ awk '$NF?$NF="inactive":$NF="active"' FS=';' OFS=';' file

最后一个字段 $NF 被评估。如果发现零,则最后一个字段 $NF 更改为“active”,否则更改为“inactive”。

打印被省略,因为将默认执行。

另一种更惯用的方法是在变量赋值中使用三元运算:

$ awk '$NF=($NF?"inactive":"active")' FS=';' OFS=';' file

答案3

perl

perl -pe 's/\d+(?!.*\d)/$& ? "Inactive" : "Active"/e' < file

如果后面没有任何数字,则将其替换为“Inactive”(如果为 0),否则将其替换为“Active”。

相关内容