Awk 使用grep-o或sed(或其他)替换除模式之间的字符

Awk 使用grep-o或sed(或其他)替换除模式之间的字符,awk,sed,grep,Awk,Sed,Grep,在下面的文件中,我想替换所有的由,生成,但当有一个字符串(用两个分隔“)时,它不应替换其中的; 例如: 输入 输出 A,B,C,D 5cc0714b9b69581f14f6427f,5cc0714b9b69581f14f6428e,1,"5cc0714b9b69581f14f6427f;16a4fba8d13",xpto, 5cc0723b9b69581f14f64285,5cc0723b9b69581f14f64294,2,"5cc0723b9b69581f14f64285;16a4fbe38

在下面的文件中,我想替换所有的
生成,但当有一个字符串(用两个
分隔“
)时,它不应替换其中的

例如: 输入

输出

A,B,C,D
5cc0714b9b69581f14f6427f,5cc0714b9b69581f14f6428e,1,"5cc0714b9b69581f14f6427f;16a4fba8d13",xpto,
5cc0723b9b69581f14f64285,5cc0723b9b69581f14f64294,2,"5cc0723b9b69581f14f64285;16a4fbe3855",xpto,
5cc072579b69581f14f6428a,5cc072579b69581f14f64299,3,"5cc072579b69581f14f6428a;16a4fbea632",xpto,
对于sed,我有:
sed's/;/,/g'input.txt>output.txt
,但这将取代一切

分隔字符串的正则表达式:
\*;.\”

(十六进制的正则表达式更好——类似于:
[0-9a-fA-F]+

我的问题是将所有这些结合起来,生成一个grep-o/sed,它可以替换除该模式之外的所有内容。

文件大小为两位数Gb(最大99Gb),因此


非常感谢您的任何想法。

如果我正确理解您的要求,一个选择就是做一个三通的东西

从你对HEX的评论中,我会考虑到输入中没有任何类似的“x”,这样你就可以(使用GNUSED):

想法是替换
当被其他内容引用时,将其写入新文件,然后替换所有
进行编码,然后设置
位于同一文件中(
-i
sed标志)

这三个过程可以组合在一个命令中

sed -E 's/("[^"]+);([^"]+")/\1#\2/g;s/;/,/g;s/#/;/g' original > transformed
也就是说,可能有一堆csv解析器已经处理了引用字段,您可能可以在最终用例中使用这些字段,因为我敢打赌,这只是链中其他部分的中间步骤


From的评论:如果一次完成,可以使用
\n
作为替换分隔符,因为文本中不能逐行换行。

sed
用于对单个字符串执行简单的
s/old/new
grep
用于执行
g/re/p
。您没有尝试执行这些任务中的任何一项,因此不应该考虑这些工具中的任何一项。这就剩下了另一个用于处理文本的标准UNIX工具--
awk

你有一个
-要生成的分隔CSV,
-分隔。这很简单:

$ awk -v FPAT='[^;]*|"[^"]+"' -v OFS=',' '{$1=$1}1' file
A,B,C,D
5cc0714b9b69581f14f6427f,5cc0714b9b69581f14f6428e,1,"5cc0714b9b69581f14f6427f;16a4fba8d13",xpto,
5cc0723b9b69581f14f64285,5cc0723b9b69581f14f64294,2,"5cc0723b9b69581f14f64285;16a4fbe3855",xpto,
5cc072579b69581f14f6428a,5cc072579b69581f14f64299,3,"5cc072579b69581f14f6428a;16a4fbea632",xpto,
以上使用GNU awk进行FPAT。有关使用awk解析CSV的更多详细信息,请参阅。

这可能适合您(GNU-sed):


替换
,内有双引号和换行符,转置
”代码转换为“
”,
”,然后将换行符转换为“

两次通过的方法是否可以接受?是。只要它能用而且速度快,我什么都拿(乞丐不能挑肥拣瘦)。考虑得很好。简单有效。谢谢我不明白你为什么不能在一次sed过程中做到这一点。@Tensibai它不起作用了。在您的第一次sed中,不会替换#。即使在末尾添加/g,也没有什么是正确的replaced@Tensibai我找到了。需要-E及其\1而不是$1<代码>sed-E的/(“[^”]+);([^“]+”/\1#\2/g”PhaseChanges_orig.csv>已转换
如果您在对sed的一次调用中就完成了这一切,那么您可以使用
\n
而不是
作为临时字符,因为您知道数据中不可能有换行符(不像您希望数据中不会出现的
)。您应该提到,您的解决方案需要对其使用的各种构造使用GNU。我应该打赌您会有一种比我天真的方法更好的方法:)
g/re/p
代表“全局正则表达式打印”,“全局搜索正则表达式并打印”。@JonyD yes,这是正确的-它是
ed
命令行
g/re/p
,其中
re
表示正则表达式。
sed -E 's/("[^"]+);([^"]+")/\1#\2/g;s/;/,/g;s/#/;/g' original > transformed
$ awk -v FPAT='[^;]*|"[^"]+"' -v OFS=',' '{$1=$1}1' file
A,B,C,D
5cc0714b9b69581f14f6427f,5cc0714b9b69581f14f6428e,1,"5cc0714b9b69581f14f6427f;16a4fba8d13",xpto,
5cc0723b9b69581f14f64285,5cc0723b9b69581f14f64294,2,"5cc0723b9b69581f14f64285;16a4fbe3855",xpto,
5cc072579b69581f14f6428a,5cc072579b69581f14f64299,3,"5cc072579b69581f14f6428a;16a4fbea632",xpto,
sed -E ':a;s/^([^"]*("[^"]*"[^"]*)*"[^";]*);/\1\n/;ta;y/;/,/;y/\n/;/' file