2013-11-07 3 views
2

У меня есть строка в следующем формате, и я хочу, чтобы преобразовать его в формат CSV (обратите внимание на разделитель является символ подчеркивания «_»AWK/Sed строки

Title_YYYYMMDD_emailname конвертировать Title,YYYYMMDD,emailname

Это достаточно просто с использованием СЭД ...

echo "Report_20131107_jlsmith" | sed 's/_/,/g' 

Выход:

Report,20131107,jlsmith 

Но есть осложнения, пытающиеся разобрать строку, содержащую символы подчеркивания в поле заголовка. Я хочу сохранить символы подчеркивания в заголовке (если есть), но изменить символы подчеркивания на запятую для даты и адреса электронной почты ...

например:

Report_Title_20131107_jlsmith convert to: Report_Title,20131107,jlsmith 

И связанный с этим вопрос: есть ли способ сжатия нескольких повторяющихся экземпляров символа подчеркивания для всей строки?

Report_Title____20131107_jlsmith convert to: Report_Title,20131107,jlsmith 

ответ

1

Последний запрос первый:

echo "Report_Title____20131107_jlsmith" | awk '{gsub(/_+/,"_")}1' 
Report_Title_20131107_jlsmith 

Первый запрос (с использованием gnu awk)

echo "Report_Title_more_20131107_jlsmith" | awk '{print gensub(/_([0-9]+)_/,",\\1,","g")}' 
Report_Title_more,20131107,jlsmith 

Все в одной команде

echo "Report_Title___more_20131107_jlsmith" | awk '{gsub(/_+/,"_");print gensub(/_([0-9]+)_/,",\\1,","g")}' 
Report_Title_more,20131107,jlsmith 
+0

Прекрасно работает ... спасибо. – user2966252

0

Использования sed

sed -r -e 's/_+/_/g' -e 's/_([^_]+)_([^_]+)$/,\1,\2/' 

Или более надежный с жестким регулярным выражением

sed -r -e 's/_+/_/g' -e 's/^(.+)_([0-9]{8})_(\w+)$/\1,\2,\3/' 
0

С форматом вы показали, вы можете заменить ____YYYYMMDD_ с ,YYYYMMDD, использованием следующим

echo 'Report_Title____20131107_jlsmith' | sed 's/__*\([0-9]\{8\}\)__*/,\1,/g' 
Report_Title,20131107,jlsmith 
Смежные вопросы