Shell 使用sed删除两个匹配模式之间的所有行,包括匹配的行
我需要删除文件中匹配的特定模式和匹配行之间的行 在下面的代码中,我想删除从对象主机“kali”{到下一次出现的}(而不是最后一次出现的})的行。并删除删除后的空格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
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
对象主机“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