sed / awk如何搜索文本并替换不包括文本块的行

时间:2017-03-22 15:54:38

标签: bash awk sed

我有一个文本文件如下

PARAMETER=VALUE
PARAMETER1=VALUE

[START]
PARAMETER=VALUE

[END]

我希望使用sed搜索完全匹配的PARAMETER,并用新文本替换整行。但是如果PARAMETER[START]之间的[END]

,我想排除相同的sed

您是否能够帮助构建awka = tf.random_uniform(shape = [5,3,3]) b = tf.ones(shape = [5,3,1]) c = tf.matmul(a,b) 命令

3 个答案:

答案 0 :(得分:1)

使用f滞后的awk:

$ awk '
/^PARAMETER/ && f!=1 { $0="THE REPLACEMENT" } # replace when flag not raised 
/\[START\]/ { f=1 }                             # raise flag at marker
/\[END\]/ { f=0 }                               # flip flag at the other
1' file                                       # output
THE REPLACEMENT
THE REPLACEMENT

[START]
PARAMETER=VALUE

[END]

修改添加了单行_

$ awk '/^PARAMETER/&&f!=1{$0="THE REPLACEMENT"}/\[START\]/{f=1}/\[END\]/{f=0}1' file

答案 1 :(得分:0)

@Prashant:试试:虽然詹姆斯的代码和我的代码之间差别不大。唯一的问题是,我想用你的话来完全匹配字符串" PARAMETER"不匹配字符串" PARAMETER1"。

awk -F"=" '/\[END\]/{A=""} /\[START\]/{A=1} !A && $1 == "PARAMETER"{print "NEW_VALUES";next} 1'  Input_file

这里我将字段分隔符设为" ="然后在一行中查找字符串START,如果是,则将变量A的值设为1.在一行中查找字符串END并将变量A的值设为NULL。因此,如果变量A的值为NULL且$ 1为PARAMETER,则检查条件,然后打印新值并给出下一个跳过进一步的语句。设置1将打印所有行(当然不会更改新值,因为当新值打印时,程序不会达到1,因此不会在那里打印)。

答案 2 :(得分:0)

使用sed:

sed '/^\[START\]/,/^\[END\]/!s/^PARAMETER=.*/replacement/'

说明:

  • /^\[START\]/,/^\[END\]/:匹配以[START]开头并以[END]
  • 结尾的所有部分
  • !:否定地址,即匹配部分之外的所有行
  • s/^PARAMETER=.*/replacement/:替换以PARAMETER=
  • 开头的每一行

示例:

$ cat input.txt
PARAMETER=VALUE
PARAMETER1=VALUE

[START]
PARAMETER=VALUE

[END]
$ sed '/^\[START\]/,/^\[END\]/!s/^PARAMETER=.*/replacement/' input.txt
replacement
PARAMETER1=VALUE

[START]
PARAMETER=VALUE

[END]
$