Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash sed/awk如何搜索文本并替换不包含文本块的行_Bash_Awk_Sed - Fatal编程技术网

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

Bash sed/awk如何搜索文本并替换不包含文本块的行,bash,awk,sed,Bash,Awk,Sed,我有一个文本文件如下 PARAMETER=VALUE PARAMETER1=VALUE [START] PARAMETER=VALUE [END] 我希望使用sed搜索精确匹配的参数,并用新文本替换整行。但是如果参数介于[START]和[END]之间,我想排除相同的参数 您能否使用以下标志在awk中帮助构造sed或awk命令: 编辑添加了一行_ $ awk '/^PARAMETER/&&f!=1{$0="THE REPLACEMENT"}/\[START\]/{f=1}/\

我有一个文本文件如下

PARAMETER=VALUE
PARAMETER1=VALUE

[START]
PARAMETER=VALUE

[END]
我希望使用sed搜索精确匹配的参数,并用新文本替换整行。但是如果参数介于[START]和[END]之间,我想排除相同的参数

您能否使用以下标志在awk中帮助构造sed或awk命令

编辑添加了一行_

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

@普拉尚特:试试看:虽然詹姆斯的代码和我的代码没有太大区别。唯一的问题是,我要你的话,像匹配字符串完全参数不匹配字符串参数1

awk -F"=" '/\[END\]/{A=""} /\[START\]/{A=1} !A && $1 == "PARAMETER"{print "NEW_VALUES";next} 1'  Input_file
这里我将字段分隔符设为=然后在一行中查找字符串START如果是,则将变量a的值设为1。查找一行中的字符串结尾并将变量a的值设为NULL。然后检查条件,如果变量A的值为NULL,$1是参数,则打印新值并给出next以跳过进一步的语句。放置1将打印课程中所有未使用新值更改的行,因为当打印新值时,程序直到1才到达,因此不会在那里打印。

使用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]
$

你能告诉我们你到底做了什么吗?如果这是个愚蠢的问题,我很抱歉。。但是我如何在一行中重新编写这个呢?我试图在SSH命令下执行此命令,但失败了,错误用法如下:awk[POSIX或GNU样式选项]-f progfile[-]file。。。用法:awk[POSIX或GNU样式选项][-]'program'文件…在本例中,只需删除注释、换行符和大部分空格,即可使其看起来既酷又紧凑!。我将把它添加到结尾。@JamesBrown您需要用反斜杠转义[和],以逐字匹配这些字符。现在,单词“开始”和“结束”中的任何字符都将开始/结束一个部分。您需要用反斜杠转义[和],以逐字匹配这些字符。现在,单词START和END中的任何字符都将开始/结束一个部分。
$ 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]
$