Linux 删除文件中以特定字符串开头和结尾的所有行
我需要检查一个文件是否包含特定的两个字符串,如果包含,则删除它们之间的所有文本(包括字符串)。假设我有一个文件Linux 删除文件中以特定字符串开头和结尾的所有行,linux,bash,Linux,Bash,我需要检查一个文件是否包含特定的两个字符串,如果包含,则删除它们之间的所有文本(包括字符串)。假设我有一个文件text,看起来像这样: line of text line of text line of text line of text #1st string line of text line of text line of text #2nd string 现在我想删除#1st string和#2nd string之间的所有行,包括这两个字符串 我尝试将整个文本放入一个变量,然后像这样删
text
,看起来像这样:
line of text
line of text
line of text
line of text
#1st string
line of text
line of text
line of text
#2nd string
现在我想删除#1st string
和#2nd string
之间的所有行,包括这两个字符串
我尝试将整个文本放入一个变量,然后像这样删除它们:
prefix=“#第一个字符串”
后缀=“#第二个字符串”
#将文件内容转换为变量
tempfile=$(cat文本)
tempfile=${tempfile#“$prefix”}
tempfile=${tempfile%“$suffix”}
echo${tempfile}
不幸的是,这不起作用,因为文本文件包含一些命令,这些命令以某种方式列出当前目录的内容,并将输出混合到变量中,从而使文件损坏。我能以某种方式防止这种情况发生吗?或者有更好的方法来实现这一点吗?您可以使用grep的before和after功能:
prefix="#1st string"
suffix="#2nd string"
grep -B 100000000 $prefix text | grep -v $prefix > output
grep -A 100000000 $suffix text | grep -v $suffix >> output
您可以使用sed删除行范围:
sed'/#第一个字符串/,/#第二个字符串/d'文本
要将结果存储到位,请使用
sed-i'/#第一个字符串/,/#第二个字符串/d'文本
还是更便携
sed'/#第一个字符串/,/#第二个字符串/d'文本>tempfile&&mv tempfile文本
最后,由于您的文件中可能只存在第一个字符串,因此必须首先检查第二个字符串是否存在:
grep-q'#第二个字符串'text&&sed'/#第一个字符串/,/#第二个字符串/d'text
另一方面,如果您在目录中看到内容,可能是因为您的文件包含一个*
通配符,无引号的扩展导致它被扩展到当前目录中的所有文件名。是的,我可以确认这是BenjaminW评论的后续情况:变量引用几乎应该总是双引号。看到和