bash while循环从文件中删除一行

时间:2014-10-23 04:48:25

标签: regex bash while-loop

我有一个数据集,我称之为“chuck'我需要摆脱一条重复的路线 我不想将sed或grep -v用于tmp文件。我愿意 使用while循环和模式识别。

D,642,0642,UBF,FOO,,M,,L,L,HPQ,9926,11080,
D,642,0642,UBF,FOO,,M,,S,S,IBM,11062,5122,
D,642,0642,UBF,FOO,,M,,S,S,INTC,35216,39833,
D,642,0642,UBF,FOO,,M,,S,S,FARFERNUGEN,213,213,
D,642,0642,UBF,FOO,,M,,L,L,JNJ,15607,12714,
D,642,0642,UBF,FOO,,M,,L,L,JPM,51225,40013,

所以我抓了我打电话的文件' chuck'我试图通过一个while循环运行它,我正在尝试 通过while循环获取每个字符串,除了字符串 我想出去。我在这做错了什么。因为输出完全相同。

#!/bin/bash
pattern="D,642,0642,UBF,FOO,,M,,S,S,Farfegnugen,213,213,"
cat /tmp/chuck | while read line
do
   [[ ! $s =~ "$pattern" ]] && echo $line
done

2 个答案:

答案 0 :(得分:2)

测试线应该是:

[[ $line =~ $pattern ]] || echo "$line"

您在测试中使用的是$s,但该测试并不存在。

使用deMorgan定律,您可以从测试中删除!并将布尔运算符更改为||以获得相同的效果。

答案 1 :(得分:1)

您的方法存在许多问题,其中最重要的是性能问题。我希望等效的sed -i脚本比shell循环运行得快得多。

但如果你坚持使用shell,你应该:

  • 避免无用使用cat;
  • 请注意,默认情况下read会破坏某些输入(使用read -r);
  • 仍然,取决于您的IFSread是脆弱的;
  • 引用所有变量,除非您特别要求shell在空格上标记化字符串并在标记上执行通配符扩展;
  • ,显然,如果您想测试变量$line,请不要测试$s

考虑到这些因素,我们获得了

#!/bin/bash
pattern="D,642,0642,UBF,FOO,,M,,S,S,DUMOSGI,213,213,"
IFS='
'
while read -r line; do
   [[ ! "$line" =~ $pattern ]] && echo "$line"
done </tmp/chuck

如果模式是静态的,使用正则表达式模式匹配是不必要的性能损失。