如何从bash脚本中删除字符?

时间:2013-03-20 12:43:01

标签: bash postgresql csv

我想使用路径将CSV个文件中的数据插入PostgreSQL tables。 文件名是filename.csv;表的名称是filename。 如何删除路径的其他部分以及.csv扩展名?

我使用以下代码但不起作用:

for i in 'ls ~/catalog/subcatalog/*.csv' ; do
  FILE = 'sed 's%~/catalog/subcatalog/%%g' $i'
  PGPASSWORD=$2 psql -q -U $1 -d testing -c "copy 'sed 's%.csv%%g' $FILE from $i delimiter ',' CSV'";
done

3 个答案:

答案 0 :(得分:1)

You shouldn't parse ls输出。你可以在任何shell中执行此操作:

for path in ~/catalog/subcatalog/*.csv
do

You can't put spaces around an equals sign for assignment

file='sed 's%~/catalog/subcatalog/%%g' $path'

要将变量分配给命令的值,请使用command substitution

file="$(sed 's%~/catalog/subcatalog/%%g' "$path")"

但是有一种更简单的方法可以获得所谓的文件基本名称(即除了主要目录之外的所有内容):

file="$(basename "$path")"

您需要Use More Quotes™以避免出现像“空格”这样的“特殊”字符的问题:

PGPASSWORD="$2" psql -q -U "$1" -d testing -c [...]

PostgreSQL命令我不确定,但如果您发现特定命令不起作用,您可能只想问另一个问题。

答案 1 :(得分:0)

您的代码不起作用,因为sed对文件或流进行操作,而不是对变量进行操作。但是你不需要sed

FILE=${i%.csv}
FILE=${FILE##*/}

这应该从.csv中删除$i扩展名并将结果存储在$FILE中,然后删除目录部分。您可以直接在终端中尝试以上内容来验证结果。

请参阅:http://tldp.org/LDP/abs/html/string-manipulation.html

答案 2 :(得分:0)

您可以这样使用basename:

...
FILE=`basename $i .csv`
...