在shell脚本/ SED / AWK中搜索A并替换A | B中的B.

时间:2017-02-02 11:01:41

标签: linux shell awk sed

我有一个文本文件,其布局为:

tableName1|counterVariable1
tableName2|counterVariable2

我想将counterVariable1替换为其他变量,例如counterVariableNew。

我该如何做到这一点?

我尝试过各种SED / AWK方法,下面提到最接近的方法:

cat $fileName | grep -w $tableName | sed -i 's/$tableName\|counterVariable/$tableName\|counterVariableNew'

但是所有3个命令都没有正确合并,请帮忙!

2 个答案:

答案 0 :(得分:2)

您的脚本是[ useless use of cat ]的示例。但这里的关键点是当与awk FS一起使用时,逃避具有特殊含义的管道定界符(它代表OR)。所以下面的脚本应该

# cat 42000479
tableName1|counterVariable1
tableName2|counterVariable2
tableName3|counterVariable2

# awk -F\| '$1=="tableName2"{$2="counterVariableNew"}1' 42000479
tableName1|counterVariable1
tableName2 counterVariableNew
tableName3|counterVariable2

执行相同操作的另一种方法是

# awk -v FS='|' '$1=="tableName2"{$2="counterVariableNew"}1' 42000479

单引号内的东西不会被扩展。

答案 1 :(得分:1)

awk -F'|' -v OFS='|' '/tableName1/ {$2="counterVariableNew"}1' file
tableName1|counterVariableNew
tableName2|counterVariable2

这将搜索A (tableName1)并将B (counterVariable1)替换为counterVariableNew

或者使用sed

sed -r '/tableName1/ s/(^.*\|)(.*)/\1counterVariableNew/g' file
tableName1|counterVariableNew
tableName2|counterVariable2

对于单词有界搜索:将模式包含在\<\>中。

sed -r '/\<tableName1\>/ s/(^.*\|)(.*)/\1counterVariableNew/g' file
awk -F'|' -v OFS='|' '/\<tableName1\>/ {$2="counterVariableNew"}1' file