我将demo.csv文件作为
html, body, .container, .sidebar, .content {
min-height: 100%;
}
我正在编写一个脚本demo.ksh来过滤掉数据
data1,text1,text01
data2,text2,text02
data3,text3,text03
data4,text4,text04
data5,text5,text05
data6,text6,text06
data7,text7,text07
data8,text8,text08
data9,text9,text09
demo.ksh和data.csv在同一个dir.demo.ksh中有+ x权限。当我运行demo.ksh为
#!/bin/ksh
while [[ $1 = -* ]]
do
case $1 in
--data)
shift
ARGS="$ARGS -e \"$1\""
;;
--excl)
ARGS="-v $ARGS"
;;
esac
shift
done
echo "grep $ARGS data.csv > test.txt"
grep $ARGS data.csv > test.txt
输出:
demo.ksh --data data3
< - 由于脚本中的回声
test.txt是空白文件(?不知道为什么) 如果由于demo.ksh中的echo而复制打印在控制台上的命令,并直接粘贴到控制台上并点击回车。它运行正常并生成test.txt为
demo.ksh --data data3
为什么它不起作用。我在shellcript中错过了某些东西或以错误的方式执行grep
答案 0 :(得分:0)
-v
开关否定了所有内容,而不仅仅是下一个字符串。重复-v
个开关就像单个-v
开关一样。将-v
开关添加到$ARG
不能对一个字符串进行局部否定,除非巧合。
由于$ARGS
不能包含正正则表达式和否定正则表达式的混合,因此请考虑使用两个单独的输入文件来保存搜索字符串:
#!/bin/ksh
pos=`mktemp`
neg=`mktemp`
while [ "$1" ]
do
case $1 in
--data)
shift
echo "$1" >> $pos
;;
--excl)
shift
echo "$1" >> $neg
;;
esac
shift
done
grep -f $pos data.csv | grep -v -f $neg > test.txt
rm $pos $neg
请注意demo.ksh
的语法保持不变,但语法不是很好,因为任何没有前面的--excl
或--data
的搜索字符串或文件名都会丢失。