我想转此(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相同
答案 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)
几点,
-r
开关来扩展正则表达式-r
也不支持非贪婪的匹配g
标志是special get flag,您可能不希望这个所以你的命令应该是:
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