Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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
Shell 使用sed删除两个匹配模式之间的所有行,包括匹配的行_Shell_Awk_Sed_Data Manipulation - Fatal编程技术网

Shell 使用sed删除两个匹配模式之间的所有行,包括匹配的行

Shell 使用sed删除两个匹配模式之间的所有行,包括匹配的行,shell,awk,sed,data-manipulation,Shell,Awk,Sed,Data Manipulation,我需要删除文件中匹配的特定模式和匹配行之间的行 在下面的代码中,我想删除从对象主机“kali”{到下一次出现的}(而不是最后一次出现的})的行。并删除删除后的空格 object Host "linux" { import "windows" address = "linux" groups = ["linux"] } object Host "kali" { import "linux" address = "linux" groups = [linux ] } object Host

我需要删除文件中匹配的特定模式和匹配行之间的行

在下面的代码中,我想删除从对象主机“kali”{到下一次出现的}(而不是最后一次出现的})的行。并删除删除后的空格

object Host "linux" {
import "windows"
address = "linux"
groups = ["linux"]
}


object Host "kali" {
import "linux"
address = "linux"
groups = [linux ]
}


object Host "windows" {
import "linux"
address = "linux"
groups = ["windows" ]
}
这是我的密码


其中一种方法是使用
AWK
。您需要将中的记录分隔符更改为
}
并运行此
awk'/卡利/;开始{RS=“}”;ORS=“}”}
,输出就是您要查找的内容

我已将问题中给出的文本保存在文件-
test.txt

ajay@DESKTOP-PCMKVK6:~$ cat test.txt
object Host "linux" {
import "windows"
address = "linux"
groups = ["linux"]
}


object Host "kali" {
import "linux"
address = "linux"
groups = [linux ]
}


object Host "windows" {
import "linux"
address = "linux"
groups = ["windows" ]
}
ajay@DESKTOP-PCMKVK6:~$ awk '!/kali/;BEGIN{RS="}"; ORS="}"}' < test.txt
object Host "linux" {
import "windows"
address = "linux"
groups = ["linux"]
}


object Host "windows" {
import "linux"
address = "linux"
groups = ["windows" ]
}
}ajay@DESKTOP-PCMKVK6:~$ 
现在我们需要运行这个awk命令
awk'/卡利/;开始{RS=“}”;ORS=“}”}'

ajay@DESKTOP-PCMKVK6:~$ cat test.txt
object Host "linux" {
import "windows"
address = "linux"
groups = ["linux"]
}


object Host "kali" {
import "linux"
address = "linux"
groups = [linux ]
}


object Host "windows" {
import "linux"
address = "linux"
groups = ["windows" ]
}
ajay@DESKTOP-PCMKVK6:~$ awk '!/kali/;BEGIN{RS="}"; ORS="}"}' < test.txt
object Host "linux" {
import "windows"
address = "linux"
groups = ["linux"]
}


object Host "windows" {
import "linux"
address = "linux"
groups = ["windows" ]
}
}ajay@DESKTOP-PCMKVK6:~$ 
ajay@DESKTOP-PCMKVK6:~$awk'/卡利/;开始{RS=“}”;ORS=“}”}'
另外,您可以使用其他答案中提到的sed,并且可以添加
-i
选项在同一文件中进行更改
sed-i'/^对象主机“kali”{$/,/^}$/d'文件名

尝试以下操作:

sed -i -Ez 's/object Host \"kali\"\s*\{[^}]*\}//g' your_file
或者,您可以尝试以下操作(也将删除空行):

输出将是:

object Host "linux" {
import "windows"
address = "linux"
groups = ["linux"]
}
object Host "windows" {
import "linux"
address = "linux"
groups = ["windows" ]
}

下面的sed应该删除
对象主机“kali”{
}
之间的所有行

sed '/^object Host "kali" {$/,/^}$/d'

通过将记录选择器设置为“无”,可以使
gnu awk
在块模式下工作

awk -v RS= -v ORS="\n\n" '/object Host "kali"/ {next} 1' file
object Host "linux" {
import "windows"
address = "linux"
groups = ["linux"]
}

object Host "windows" {
import "linux"
address = "linux"
groups = ["windows" ]
}
  • /object Host“kali”/{next}
    如果块包含
    对象主机“kali”
    ,请跳过它
  • 1
    始终为真,执行默认操作,打印
这可能适合您(GNU-sed):

或:

第一个解决方案与grep类似,并选择不打印以
对象主机“kali”{
开头、以
}
结尾的行

sed '/^object Host "kali" {$/,/^}$/d'
第二种解决方案收集上述两种模式之间的线条,然后删除这些线条

如果第一个模式匹配,第一个解决方案将更改文件,而第二个解决方案仅在两个模式匹配时更改文件。这是因为命令
n
n
如果要求sed读取文件末尾以外的内容,则会导致sed结束处理<如果设置了
-n
选项,则code>n
将安静地结束,而
n
将在停止之前打印图案空间中的任何内容


注意:
/^}/
匹配行开始处的
}
,在第二种解决方案中,添加了
M
标志,该标志打开多行匹配,即新行之后/之前的
^
$
匹配此标志特定于GNU sed<代码>/\n}/
将具有相同的效果。如果匹配更加轻松,即匹配任何出现的
}
/}/
就足够了。

您自己尝试过什么吗?也可以看到一些答案,只需稍加修改(即删除或添加一个字母),就可以应用于此问题。例如:
sed-n'/PAT1/,/PAT2/p'文件名
,只需添加一个
,因此它变成了
sed-n'/PAT1/,/PAT2/!p’filename
回答了这个问题。另请参见:。特别是,它涵盖了这个问题的正变量、负变量、包含变量和独占变量的所有排列。`NONE='\033[00m'RED='\033[01;31m'clear echo-e“在配置文件中输入要删除的主机”cat>deletionfile.txt读取主机名时清除主机名do loc=
grep-il'object.*Host.*/home/afrith/config file/*.conf
sed-i/^object.*Host.*\“$Host\”*{$/,/^}$/d”$loc done/,/只与delete命令一起工作,而不与substitute一起工作?我使用了
sed的/^对象主机“kali”{$\/,\/^$/'myfile
,但它不起作用,毫无意义。您想用什么来代替它呢?
/^对象主机“kali”{$/,/^}$/
是一个区域-模式之间的所有行直到模式。您可以
/^对象主机“kali”{$/,/^}$/s/regex/pattern/
。这很有意义!我想用一些字符串替换匹配的行在我的情况下没有任何内容(这意味着删除它)您不能(至少不是那么容易)因为sed一次解析一行。所以你不能替换多行。但是
sed
有一些命令(实际上是它自己的语言)允许这样做。嗯……我只想
/^对象宿主“kali”{$/,/^}$/s//replacement/
,我认为它应该可以工作。
sed -n '/^object Host "kali" {/{:a;n;/^}/d;ba};p' file
sed '/^object Host "kali" {/{:a;N;/^}/Md;ba}' file