查找/替换:带有一些逻辑的正则表达式,引号 - 从输入文件到输出文件,单次传递

时间:2014-11-20 07:34:18

标签: regex linux bash replace sed

我有一个文件:

input.txt

a|400|green|blahblah|big
b|2500|red|text|small
a|1400|blue|something|medium

我希望将其转换为

output.txt (注意不同的引号):

color: "green"; size: "big"; price: 400
color: 'red'; size: 'small'; price: 2500
color: "blue"; size: "medium"; price: 1400

也就是说,正则表达式找到:

^[ab]\|(.*?)\|(.*?)\|.*?\|(.*?)$

并替换为以下内容:

  • 如果一行以a|开头:

    color: "\2"; size: "\3"; price: \1

  • 如果一行以b|开头:

    color: '\2'; size: '\3'; price: \1

如何在Unix命令行,sed,Cygwin或Bash中一次性完成此操作?性能越高越好(那些文件真的很大)

4 个答案:

答案 0 :(得分:3)

您可以使用此awk命令:

awk -F '\\|' -v sq="'" '$1=="a"{q="\""} $1=="b"{q=sq} {
   printf "color: %s%s%s; size: %s%s%s; price: %s\n", 
   q, $3, q, q, $5, q, $2}' input.txt > output.txt
color: "green"; size: "big"; price: 400
color: 'red'; size: 'small'; price: 2500
color: "blue"; size: "medium"; price: 1400

答案 1 :(得分:2)

sed -e "s/^a|/\"/;s/^b|/'/;s/\(.\)\([^|]*\)|\([^|]*\).*|\([^|]*\)/color: \1\3\1; size: \1\4\1; price: \2/" YourFile

posix sed(GNU sed上的--posix

答案 2 :(得分:1)

#!awk -f
BEGIN     {FS = "|" }
$1 == "a" {z  = "\""}
$1 == "b" {z  = "'" }
$0 = "color: " z$3z "; size: " z$5z "; price: " $2

像这样跑

foo.awk input.txt > output.txt

答案 3 :(得分:1)

与anubhavas相似,但采用不同的方法,在评论中写一下会有点困难。 显然,这假设只有ab作为第一个字段

awk -F'|' '{q=$1=="a"?"\x22":"\x27"}
           {print "color:",q$3q"; size:",q$5q"; price:",$2 }' file

工作原理

将字段分隔符设置为|
根据第一个字段是'使用它们的十六进制值,将变量q设置为"a 然后打印行,引号替换为q

中的值

够简单!