我有一个数据文件,我正在尝试导入到redshift (postgress数据库)。我正在尝试使用分隔符'|‘导入postgres。但是有些数据在字符串数据本身中有'|‘,例如:
73779087|"UCGr4c0_zShyHbctxJJrJ03w"|"ItsMattSpeaking | SuPra" 所以我尝试了这个sed命令:
sed -i -E "s/(.+|)(.+|)|/\1\2\\|/g" inputfile.txt >outputfile.txt您知道sed命令有什么问题吗?将最后一个字符串中的|替换为|转义字符,这样Redshift就不会将其视为分隔符?任何帮助都是非常感谢的。
发布于 2015-12-10 17:22:02
这可能适用于您(GNU sed):
sed -r ':a;s/^([^"]*("[^"|]*"[^"]*)*"[^"|]*)\|/\1/g;ta' file这将删除双引号中的|,但它不支持带引号的引号,因此要小心!
发布于 2015-12-10 08:31:06
有些事情你不会使用SED,我会说这就是其中之一。尝试将python脚本与re库一起使用,或者仅使用普通的字符串操作。
发布于 2015-12-10 12:40:32
我认为这段C++代码可以满足您的需求。
// $ g++ -Wall -Wextra -std=c++11 main.cpp
#include <iostream>
int main(int, char*[]) {
bool str = false;
char c;
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
while (std::cin.get(c)) {
if (c == '|') {
if (str) {
std::cout << '\\'; } }
else if (c == '"') {
// Toggle string parsing.
str = !str; }
else if (c == '\\') {
// Skip escaped chars.
std::cout << c;
std::cin.get(c); }
std::cout << c; }
return 0; }本例中sed的问题在于,为了跟踪您所处的状态(字符串或非字符串),您需要了解更多的基础知识。
https://stackoverflow.com/questions/34191192
复制相似问题