使用两种模式从文本文件中查找特定行,然后在该行上替换变量字符串

时间:2019-04-18 20:48:33

标签: shell awk sed

我有一个大文本文件(myfile.txt),在其中正好一行中,我试图将值“ 0.999999999”替换为另一个数字,例如“ 0.111111111”。

expression "if((CONDITION1==1),0.999999999,CATEGORY1)"

可以通过查找前面和后面的字符串来唯一地标识该行(必须在一起,否则该模式不是唯一的),或者在这种情况下

'expression "if((CONDITION1==1),'
and
',CATEGORY1)"'

研究了其他几篇文章后,我发现我的案子具有挑战性

  1. 通过多种模式识别特定行,并且
  2. 替换无法自行搜索的字符串(因为它可能会更改)

我看到的第一个问题在其他帖子中已经解决,但是我对第二个问题感到困惑。

我尝试了几种不同的方法,但是没有一种方法能产生正确的结果,我得到的最接近的方法是:

sed -n '/if((CONDITION1==1).CATEGORY1)/{ s/\,*\,/\,0.111111111\,/p }' myfile.txt

我试图通过查找部分前缀和后缀字符串来标识字符串,然后尝试替换两个逗号之间的所有内容,包括两个逗号。

我的问题是:

  1. 我做错了什么?
  2. sed是执行此任务的最佳工具,还是awk或perl做得更好?谢谢。

===============编辑=============

我已经基于@Ed的版本更新了我的代码,以便在基于输入运行代码时能够从该文件中提取的变量中读取值。希望以后能对某人有所帮助:

#test.sh
month= $1
VAL= $(cat data_$month.dat | awk 'NR==2') 
echo "VAL is:" $VAL
sed -i 's/\(expression "if((CONDITION1==1),\)[^,]*\(,CATEGORY1)"\)/\1'"${VAL}"'\2/' file

2 个答案:

答案 0 :(得分:1)

$ sed 's/\(expression "if((CONDITION1==1),\)[^,]*\(,CATEGORY1)"\)/\10.111111111\2/' file
expression "if((CONDITION1==1),0.111111111,CATEGORY1)"

下面是一个示例,说明为什么未捕获的部分应该是[^,]*而不是.*

$ cat file
expression "if((CONDITION1==1),0.999999999,CATEGORY1)"  # this is ",CATEGORY1)"
expression "if((CONDITION1==1),0.999999999,FOO)"        # this is not ",CATEGORY1)"

$ sed 's/\(expression "if((CONDITION1==1),\)[^,]*\(,CATEGORY1)"\)/\10.111111111\2/' file
expression "if((CONDITION1==1),0.111111111,CATEGORY1)"  # this is ",CATEGORY1)"
expression "if((CONDITION1==1),0.999999999,FOO)"        # this is not ",CATEGORY1)"

$ sed 's/\(expression "if((CONDITION1==1),\).*\(,CATEGORY1)"\)/\10.111111111\2/' file
expression "if((CONDITION1==1),0.111111111,CATEGORY1)"
expression "if((CONDITION1==1),0.111111111,CATEGORY1)"

答案 1 :(得分:0)

如果您的数据位于“ d”文件中,请尝试使用gnu sed:

.fa-facebook {
    color: black; /* or any other color */
}
相关问题