Используйте технику @Porculus, предложенную в его ответе:
perl -pe '$i += 1; chomp; @a = split /\t/; $_ = "INSERT INTO XYZ VALUES($i, '\''$a[4]'\'');\n";'
Это закрывает строку в одинарных кавычках непосредственно перед одинарной кавычкой, затем использует экранированную одинарную кавычку, а затем открывает новую строку в одинарных кавычках.
Прелесть этой техники в том, что вы можете автоматизировать ее:
sed -e "s/'/'\\\\''/g" -e "s/^/'/" -e "s/$/'/" <<'EOF'
$i += 1; chomp; @a = split /\t/; $_ = "INSERT INTO XYZ VALUES($i, '$a[4]');\n";
EOF
В результате получается строка в правильных кавычках, которую вы можете вставить в командную строку:
'$i += 1; chomp; @a = split /\t/; $_ = "INSERT INTO XYZ VALUES($i, '\''$a[4]'\'');\n";'
Или вы можете сделать для него скрипт оболочки:
$ cat > quotify
#!/bin/sh
sed -e "s/'/'\\\\''/g" -e "s/^/'/" -e "s/$/'/"
^D
$ chmod +x quotify
$ ./quotify
$i += 1; chomp; @a = split /\t/; $_ = "INSERT INTO XYZ VALUES($i, '$a[4]');\n";
^D
'$i += 1; chomp; @a = split /\t/; $_ = "INSERT INTO XYZ VALUES($i, '\''$a[4]'\'');\n";'
(Вышеуказанный sed сначала заменяет каждый '
на '\''
, затем ставит '
спереди и сзади.