我有一个我称之为'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 回答
测试线应该是:
您在测试中使用
$s
,该测试不存在 .使用deMorgan定律,您可以从测试中删除
!
并将布尔运算符更改为||
以获得相同的效果 .您的方法存在许多问题,尤其是性能问题 . 我希望等效的
sed -i
脚本比shell循环运行得快很多 .但如果你坚持使用shell,你应该:
避免无用
cat
;请注意,默认情况下
read
会破坏一些输入(使用read -r
);仍然,根据你的
IFS
,read
是脆弱的;引用所有变量,除非您特别要求shell在空格上标记化字符串并在标记上执行通配符扩展;
,显然,如果要测试变量
$line
,请不要测试$s
考虑到这些因素,我们获得了
如果模式是静态的,则使用正则表达式模式匹配是不必要的性能影响 .