如何在linux中通过传递变量从包含字符串的行之前的文件中删除所有数据

如何在linux中通过传递变量从包含字符串的行之前的文件中删除所有数据,linux,shell,Linux,Shell,我试图从一个文件中修剪行上方的数据,其中行通过向其传递变量来包含一些字符串 varfile=$(cat variable.txt) echo "$varfile" if [ -z "$varfile" ]; then echo "null" else echo "data" sed "1,/$varfile/d" fileee.txt fi 这里,我从variable.txt文件中提取一个字符串,试图在fileee.txt文件中找到该文本,并删除该行上方的所有数据 例如:var

我试图从一个文件中修剪行上方的数据,其中行通过向其传递变量来包含一些字符串

varfile=$(cat variable.txt)
echo "$varfile"
if [ -z "$varfile" ]; then
    echo "null"
else
    echo "data"
sed "1,/$varfile/d" fileee.txt
fi
这里,我从variable.txt文件中提取一个字符串,试图在fileee.txt文件中找到该文本,并删除该行上方的所有数据

例如:variable.txt有3个 我在fileee.txt中找到了3个,并删除了3个以上的数据

INPUT:
1
2
3
4
OUTPUT:
3
4

我想这里的问题是,您希望在匹配之前删除所有行,而不是匹配行本身

使用GNU sed的一种方法是首先为匹配行显式添加打印:

pattrn=3
seq 1 4 | sed -e "/$pattrn/p;1,/$pattrn/d"
尽管这将复制与模式匹配的任何其他行

更好的办法是,颠倒比赛的感觉:

seq 1 4 | sed -ne "/$pattrn/,\$p"
也就是说,默认情况下不打印(
-n
),而是打印(
p
)从匹配项到结尾的任何内容(
$
,由于双引号字符串而转义)

最好使用
awk

pattrn=3
seq 1 4 | awk -vpat="$pattrn" '$0 ~ pat {p=1} p'
这将在整行(
$0
)与模式匹配的行上设置一个标志(
~
是正则表达式匹配),然后在设置该标志时打印行

awk
解决方案也更好,因为模式中的特殊字符不会引起问题(至少没有那么多);在
sed
情况下,如果模式包含斜杠
/
,它将终止
sed
代码中的正则表达式,并导致语法错误或允许代码注入


我在这里使用GNU coreutils中的
seq
只是为了组成输入的数字序列。

我想这里的问题是,您想删除匹配之前的所有行,而不是匹配行本身

使用GNU sed的一种方法是首先为匹配行显式添加打印:

pattrn=3
seq 1 4 | sed -e "/$pattrn/p;1,/$pattrn/d"
尽管这将复制与模式匹配的任何其他行

更好的办法是,颠倒比赛的感觉:

seq 1 4 | sed -ne "/$pattrn/,\$p"
也就是说,默认情况下不打印(
-n
),而是打印(
p
)从匹配项到结尾的任何内容(
$
,由于双引号字符串而转义)

最好使用
awk

pattrn=3
seq 1 4 | awk -vpat="$pattrn" '$0 ~ pat {p=1} p'
这将在整行(
$0
)与模式匹配的行上设置一个标志(
~
是正则表达式匹配),然后在设置该标志时打印行

awk
解决方案也更好,因为模式中的特殊字符不会引起问题(至少没有那么多);在
sed
情况下,如果模式包含斜杠
/
,它将终止
sed
代码中的正则表达式,并导致语法错误或允许代码注入


我在这里使用GNU coreutils中的
seq
只是为了组成输入的数字序列。

您发布的代码有什么问题?它为什么不能提供您想要的结果?您发布的代码有什么问题?它为什么不能提供您想要的结果?