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评论的后续情况:变量引用几乎应该总是双引号。看到和