2014-10-29 89 views
-2

我有一个要求,即必须读取文件并进行操作。如果它在任何字段中找到,我必须将单双引号替换为双引号。字段由|分隔。 请在下面找到更好的理解。在UNIX中读取文件并操作

输入:

1234567|9393874|"Hi"|"How are "you"" 
98647489|20370483|"i am "good""|"what about "you"" 

输出:

1234567|9393874|"Hi"|"How are ""you""" 
98647489|20370483|"i am ""good"""|"what about ""you""" 
+0

你看'人sed'? – Madbreaks 2014-10-29 17:14:59

+0

我是UNIX新手,所以你有一些想法,请帮助。我会看看sed。谢谢。 – user1891602 2014-10-29 17:16:30

+0

“'|”是否出现在引用区域内,例如'1234567 | 9393874 |“Hi”|“我们使用管道(|)作为分隔符”'? – 2014-10-29 18:10:24

回答

0

我会取代所有的 “边缘” 与其它字符引用,然后替换 “内部” 的:

sed -e 's/|"/|_/g' -e 's/"|/_|/g' -e 's/"$/_/' file | sed 's/"/""/g' | sed 's/_/"/g' 

它返回:

1234567|9393874|"Hi"|"How are ""you""" 
98647489|20370483|"i am ""good"""|"what about ""you""" 

循序渐进:

$ sed -e 's/|"/|_/g' -e 's/"|/_|/g' -e 's/"$/_/' a 
1234567|9393874|_Hi_|_How are "you"_ 
98647489|20370483|_i am "good"_|_what about "you"_ 
$ sed -e 's/|"/|_/g' -e 's/"|/_|/g' -e 's/"$/_/' a | sed 's/"/""/g' 
1234567|9393874|_Hi_|_How are ""you""_ 
98647489|20370483|_i am ""good""_|_what about ""you""_ 
$ sed -e 's/|"/|_/g' -e 's/"|/_|/g' -e 's/"$/_/' a | sed 's/"/""/g' | sed 's/_/"/g' 
1234567|9393874|"Hi"|"How are ""you""" 
98647489|20370483|"i am ""good"""|"what about ""you""" 
+0

谢谢你的回答。实际上,我有超过1千万记录的数据文件。在这种情况下是否可行? – user1891602 2014-10-29 17:19:52

+0

@ user1891602提供了有关此方法是否有所帮助的代表性意见和反馈。 – fedorqui 2014-10-29 17:20:19

+0

@ user1891602那么这种方法对你有帮助吗?如果是这样,您可以通过点击答案旁边的复选标记将其标记为已接受,以将其从灰色变为填充。 – fedorqui 2014-10-30 11:18:35