编辑: 我意识到我当前的代码是垃圾,但我之前尝试过的其他方法也没有用。问题是我在Windows上用Notepad ++编辑了文件,并让它们在Linux上运行。程序dos2unix可以解决问题。
解决方案: 我在Windows中使用Notepad ++来编写导致问题的文件。通过dos2unix运行文件修复它。
我写了一个小的bash脚本,它应该删除$ 2的每一行,其中包含一个在$ 1中指定的单词并将输出写入$ 3。但不知怎的,它不会像它应该的那样工作。
#!/bin/bash
set -f
while IFS='' read -r i || [[ -n "$i" ]]; do
sed -i "/$i/d" "$2"
done < "$1"
编辑:
档案1.test:
123
678
456
file 2.test:
dasdas123dasd
3fsef344
678 3423423
r23r23rfsad
456 dasdasd
运行脚本:
./script.sh 1.test 2.test
输出应为:
3fsef344
r23r23rfsad
但是它是:
dasdas123dasd
3fsef344
678 3423423
r23r23rfsad
答案 0 :(得分:3)
你为什么要使用shell循环和sed呢?
$ grep -vFf file1 file2
3fsef344
r23r23rfsad
如果那不能满足您的需求,请使用更具真实代表性的示例来澄清您的问题,因为&#34;使用shell循环多次调用sed&#34;不是任何问题的答案。有关我说的一些原因,请参阅https://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice。
答案 1 :(得分:0)
每次拨打$2
时,您都会重新加载$3
并覆盖sed
。您应该将所有操作应用于文件而不是重新加载。
#!/bin/bash
set -f
cat "$2" > "$3"
while IFS='' read -r i || [[ -n "$i" ]]; do
sed -i "/$i/d" "$3"
done < "$1"