1

我想把这个(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 相同

4

5 回答 5

2

awk可能更适合您正在尝试做的事情:

awk -F\; '{printf "<tr><td>%s</td><td>%s</td><td>%s</td></tr>\n",$1,$2,$4}'
于 2012-06-26T18:44:50.293 回答
2
sed -r -ne 's:^([^;]+);([^;]+);[^;]+;([^;]+);.*:<tr><td>\1</td><td>\2</td><td>\3</td></tr>:p' 

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

如果您想跳过使用 ERE 以实现可移植性(即您使用的是 Solaris 或 HP/UX 等),则正则表达式可能是:

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

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

于 2012-06-26T19:03:29.177 回答
1

为什么要使用 sed?

awk '{print "<tr><td>"$1"</td><td>"$2"</td><td>"$4"</td></tr>}
    ' IFS=';' Mitarbeiter.csv > header-content.html
于 2012-06-26T18:44:48.723 回答
1

几点,

  1. 您需要-r扩展正则表达式模式的开关
  2. sed是贪心的,甚至-r不支持非贪心匹配
  3. gflag 是一个特殊的get flag,你可能不想要这个

所以你的命令应该是:

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

请注意,您的项目中不能有分号,因为这是字段分隔符。如果你是一个真正的 csv 文件,这将不起作用,因为它不会忽略转义的分号,无论是用引号还是转义字符。

于 2012-06-26T19:01:31.843 回答
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
于 2012-06-26T19:05:42.327 回答