使用SED删除文件中的文本

使用SED删除文件中的文本

我正在尝试创建一个 bash 脚本,用于为朋友管理一个基本的库存系统。他想要盘点的所有东西都有一个条形码,扫描后会返回一个 6 位数字(例如 000001)。我有一段代码,它应该接受任何输入,将其命名为 $current,然后在 data.txt 中找到 $current 并删除该行。输入完代码后,我输入 0 来停止

我无法让 sed 直接替换文件中的文本,因此我将其复制到另一个文件,覆盖原始文件,然后删除副本。但是,每当我运行此文件的一部分时,它都会在 sed 命令处冻结并停止运行,我可以输入任何我想要的内容,但它不会执行任何操作,包括退出命令“0”。

read current
until [ $current -eq 0 ]
do
   sed '0,/$current/{/$current/d;}' >> data1.txt
   cp data1.txt data.txt
   rm data1.txt
   read current
done

答案1

您没有提供sed任何输入,因此它在 stdin 上等待。您可能想要data.txt就地编辑:

sed -i "0,/$current/{/$current/d;}" data.txt

这样就省去了cprm调用。请注意,我在表达式中使用了双引号,变量不在单引号中展开

答案2

请注意,在脚本中插入变量sed永远不是一个好主意。如果有人输入.*,您的脚本将删除所有行。如果有人输入/sed将输出错误。这是一种非常脆弱的方法。

要删除包含某个字符串的第一行,我建议使用awk及其index功能:

awk -i inplace 'index($0,c)&&!f{f=1;next}1' c="$current" file

测试运行:

$ cat file
aaa / ccc
/ eee fff

$ current=/

$ awk 'index($0,c)&&!f{f=1;next}1' c="$current" file
/ eee fff

$ sed "0,/$current/{/$current/d;}" file
sed: -e expression #1, char 5: unknown command: `/'

相关内容