在bash中删除具有特定字符串的每一行

时间:2018-02-25 01:12:14

标签: bash sed cat

编辑: 我意识到我当前的代码是垃圾,但我之前尝试过的其他方法也没有用。问题是我在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

2 个答案:

答案 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"