在sed中使用正则表达式转换文件

时间:2012-06-26 18:38:16

标签: regex sed

我想转此(Mitarbeiter.csv):

Max;Mustermann;02.03.1964;501;GL;Prokurist
Monika;Mueller;02.02.1972;500;Sek;Chefsekretaerin
Michael;Maier;06.07.1985;617;Aquise;-

进入此(header-content.html):

<tr><td>Max</td><td>Mustermann</td><td>501</td></tr>
<tr><td>Monika</td><td>Mueller</td><td>500</td></tr>
<tr><td>Michael</td><td>Maier</td><td>617</td></tr>

使用sed

我试过了:

sed 's#^\([^\]+\);\([^\]+\);[^\]+;\([^\]+\);.*$#<tr><td>\2</td><td>\1</td><td>\3</td></tr>\n#g' <Mitarbeiter.csv >header-content.html

但这没有任何作用。输出与Mitarbeiter.csv相同

5 个答案:

答案 0 :(得分:2)

awk可能会更适合您要做的事情:

awk -F\; '{printf "<tr><td>%s</td><td>%s</td><td>%s</td></tr>\n",$1,$2,$4}'

答案 1 :(得分:2)

sed -r -ne 's:^([^;]+);([^;]+);[^;]+;([^;]+);.*:<tr><td>\1</td><td>\2</td><td>\3</td></tr>:p' 

或者,如果您使用的是OSX或旧版本的FreeBSD或NetBSD,请将-r替换为-E以使用扩展正则表达式。

如果您想跳过使用ERE的可移植性(即您使用的是Solaris或HP / UX或其他类似的东西),则正则表达式可能是:

^\([^;][^;]*\);\([^;][^;]*\);[^;]*;\([^;][^;]*\);.*

请注意,这两个字段每个字段至少需要1个字符。如果允许字段为空......那么,在我们将更多时间花在可能不需要的事情之前,请更新您的问题。 : - )

答案 2 :(得分:1)

为什么要使用sed?

awk '{print "<tr><td>"$1"</td><td>"$2"</td><td>"$4"</td></tr>}
    ' IFS=';' Mitarbeiter.csv > header-content.html

答案 3 :(得分:1)

几点,

  1. 您需要-r开关来扩展正则表达式
  2. Sed很贪婪,甚至-r也不支持非贪婪的匹配
  3. g标志是special get flag,您可能不希望这个
  4. 所以你的命令应该是:

    sed -r 's#^([^\;]+);([^\;]+);[^\;]+;([^\;]+);.*$#<tr><td>\1</td><td>\2</td><td>\3</td></tr>#' < Mitarbeiter.csv > header-content.html
    

    请注意,您的商品中不能包含分号,因为这是字段分隔符。如果你是一个真正的csv文件,这将不起作用,因为它不会忽略转义的分号,用引号或转义字符包裹。

答案 4 :(得分:1)

如果您坚持使用sed,可以尝试:

$ p='\([^;]*\);'
$ sed "s@$p$p$p$p.*@<tr><td>\1</td><td>\2</td><td>\4</td></tr>@" \
         Mitarbeiter.csv > header-content.html