【发布时间】:2023-03-30 08:30:01
【问题描述】:
我有两个文件;第一个包括我想在第二个文件 (file.cfg) 中搜索的模式 (file.txt)。
一旦在“file.cfg”中找到模式,我想删除它 + 之后的任何内容,直到下一个 Hello 出现在该行的开头。
我已经创建了以下脚本,但它不起作用:
#! /bin/bash
cat file.txt | while read LINE; do
echo $LINE
sed -i "/^$LINE$/,/^Hello/{//p;d;}" "file.cfg"
sed -i "/^$LINE$/d" "file.cfg"
done
昨天在测试文件上工作正常,今天我修改了文件名,但它停止工作了。
我不确定我是否错误地更改了某些内容,但如果我将使用 Ubuntu 命令行中的以下内容,它可以工作:
sed -i "/^Hello World$/,/^Hello/{//p;d;}" "file.cfg"
另外,我在循环中添加了echo,可以看到“file.txt”中的每一行
为了提供更多信息,我将举例说明我需要使用此代码实现什么:
“file.txt”包含模式一旦找到模式,我需要在“file.cfg”中找到匹配项,我需要将其删除,然后在下一个 Hello 之前出现任何内容。
sed -i "/^$LINE$/,/^Hello/{//p;d;}" "file.cfg" --> 这行应该删除中间的任何东西。
sed -i "/^$LINE$/d" "file.cfg" --- > 删除模式本身。
+++++++++++
请看下面的例子:
File.cfg 分为多个部分;每个部分都以 Hello 开头
File.txt 包含随机部分名称;我需要一个脚本来从 File.txt 中读取该部分的名称并查看它是否在 file.cfg 中可用,然后删除该部分名称及其所有内容
文件.txt:
Hello World
Hello Mohammad
Hello Scripting
文件.cfg:
Hellow xyz
a
b
c
Hello World
v
b
n
Hello stack
q
w
e
最终结果应该是:
Hellow xyz
a
b
c
Hello stack
q
w
e
找到部分名称后,我需要删除所有内容,直到出现在行首的下一个“Hello”(新部分)。
除了部分名称之外,没有任何行以 Hello 开头。
【问题讨论】:
-
在循环中使用
sed -i反复重写同一个文件效率低下且容易出错。可能会尝试重构以从您的输入文件创建单个sed脚本。并尝试shellcheck.net 向您指出代码中的一些其他常见错误。 -
请阅读why-is-using-a-shell-loop-to-process-text-considered-bad-practice 以了解您的脚本的一些问题,is-it-possible-to-escape-regex-metacharacters-reliably-with-sed 了解其他问题,并将其复制/粘贴到shellcheck.net 以了解更多信息。 edit您的问题包括简洁、可测试的样本输入和预期输出,以便我们为您提供帮助。
-
并且在说明匹配文本的要求时不要使用“模式”这个词,因为它非常模棱两可,而是使用 regexp-or-string 加上 full-or-partial。见how-do-i-find-the-text-that-matches-a-pattern。
-
感谢您提供的文件。你能帮我修复我的代码吗?我还是脚本新手,我应该今天就让它工作。
-
我们绝对可以帮助您修复您的代码,但我们需要您告诉我们它应该做什么并首先提供一个示例。我们目前甚至不知道
$LINE是否应该被视为正则表达式或字符串(例如,LINE 中的a.c是否应该与 .cfg 文件中的abc匹配?)。请edit您的问题,至少将“模式”替换为正则表达式或字符串,并添加示例输入和预期输出,以演示您需要脚本执行的操作,我们可以复制/粘贴以进行测试。
标签: linux ubuntu sed while-loop