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
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 文字が必要であることに注意してください。フィールドを空にすることが許可されている場合...まあ、必要のないことに時間を費やす前に、質問を更新してください。:-)

于 2012-06-26T19:03:29.177 に答える
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 に答える
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 に答える
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. gフラグは特別な get フラグです。おそらくこれは必要ありません

したがって、コマンドは次のようになります。

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 に答える