我正在尝试从文件中修剪行上方的数据,其中包含一些字符串的行通过将变量传递给它
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 文件中找到该文本并删除该行上方的所有数据
EX: variable.txt 有 3 我在 fileee.txt 中找到了 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
代码中的正则表达式,并导致语法错误或允许用于代码注入(inject)。
我在这里使用 GNU coreutils 中的 seq
只是为了组成输入的数字序列。
关于linux - 如何通过在 linux 中传递变量从包含字符串的行之前的文件中删除所有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47572202/