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

标签 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 文件中找到该文本并删除该行上方的所有数据

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/

相关文章:

linux - 使用 Bash 脚本自动插入密码

c - 此代码是否将毫秒返回到纪元时间的秒数

regex - 如何检查 bash 中字符串的最后一个字符?

linux - 查找具有特定名称且没有指向它们的符号链接(symbolic link)的文件夹

android - 以渲染缓冲区作为源兄弟和纹理作为目标兄弟的 EGLImages

mysql - 日期格式问题 STR_TO_DATE ('18:11:52' , '%H:%i:%s' ) 返回 NULL

macos - 对逗号分隔的值列表进行排序

arrays - 查找两个 Bash 数组之间的公共(public)项

arrays - 使用 shell 变量选择一个 bash 数组

javascript - sed 命令取消注释代码行