我正在尝试创建一个 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
这样就省去了cp
和rm
调用。请注意,我在表达式中使用了双引号,变量不在单引号中展开。
答案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: `/'