如何在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
只是为了组成输入的数字序列。您发布的代码有什么问题?它为什么不能提供您想要的结果?您发布的代码有什么问题?它为什么不能提供您想要的结果?