2017-03-01 124 views
0

我已经写了一个通用的unix脚本来从任何csv加载oracle表。现在csv中的分隔符(字段分隔符)可以是任何类似','或'|“或':'等。 因此,我试图明确地将delimeter作为参数传递给脚本,并且它对大多数的delimeters工作正常,但是当我尝试传递|那么它不会给我正确的结果,因为它将隐式转换为|传递“|”作为unix脚本的参数

ksh -x myscript csv_name | 

#不工作

ksh -x myscript csv_name , 

#工作

请告诉我,如果有用于此的逃生?

+0

什么秋后算账? '\ |'或'“|”'? – arkascha

+0

试试'ksh -x myscript csv_name'\ |'' - 脚本可能会尝试在正则表达式中使用分隔符,并在'|'字符上跳转,这在正则表达式中有特殊含义。 – user4815162342

+0

没有看到“myscript”很难回答。一旦“管道”字符进入shell脚本,几乎任何事情都可能出错。 需要考虑的一件事是将“管道”翻译成别的东西,然后在脚本中使用它。我建议这样做的原因是,外壳将会在你的每一步都与你相抗衡。即使你将它翻译成ctrl-a或其他东西,它也可能比试图逃避每一个正则表达式和每个变量扩展更容易,而只留下合法的“管道”。 –

回答

0

在我的机器测试,你需要使用下面的命令 -

ksh -x test.sh file "|" 

OR

ksh -x test.sh file \| 

OR

ksh -x test.sh file '|' 

我们需要禁用的功能 “|”使用转义,单引号或双引号。

测试 -

cat file 
A|B|B|A 
A|A|A 
B|A|B|A 
B|B 
A|A 
A|B 
A|A|B 

cat test.sh 
vFile=$1 
sep=$2 
awk -F "$sep" '{print $1,$2}' ${vFile} 

ksh -x test.sh file "|" 
A B 
A A 
B A 
B B 
A A 
A B 
A A 
+0

我试过了,但没有工作......全部三个 –

+0

@ SouraviSinha-错误信息/输出是什么? –

+0

@SouraviSinha - 检查我的更新示例.. –