perl -0777 -e 'print join "\n", <> =~ m/Name.*?Address:\s*([\d.]+)/gms;'
Использует многострочное регулярное выражение для сопоставления "цифр и точек" после "Address:", которому непосредственно предшествует (поскольку . *?
неладно) по имени
Читает это из <>
, который является магическим дескриптором файла - читает либо STDIN, либо указанные файлы, например
perl -0777 -e 'print join "\n", <> =~ m/Name.*?Address:\s*([\d.]+)/gms;' somefile
В качестве альтернативы можно установить разделитель записей на «Имя»:
perl -lne '$/="Name:"; /Address: ([\d\.]+)/ && print $1'
Из-за отсутствия g
он соответствует только в первый раз в каждой «записи».
Easy done by sed
sed 's/\(\([^,]*,\)\{4\}\)\(.*\)/\1\L\3/' file.csv
если вам не нравится экранирование символов, вы можете модифицировать скрипт (для GNU sed):
sed -r 's/(([^,]*,){4})(.*)/\1\L\3/' file.csv
который находит четыре группы любых (0 включительно) символов без запятой, за которыми следует запятая, и оставляет их без изменений (\1
) и меняет все в оставшейся части строки (\3
) на более низкую версию.
вырезать
и вставить
paste -d, <(cut -d, -f-4 file.csv) <(cut -d, -f5- file.csv | tr '[[:upper:]]' '[[:lower:]]')
Возможно, я неправильно понял вопрос, поэтому, пожалуйста, простите меня, если я понял. Однако кажется, что вы должны иметь возможность просто высветить
любое поле больше 4 (или 40, или как вам угодно). Например:
BEGIN {
OFS = ","
}
{
for (i = 4 ; i <= NF ; i++) {
$i = tolower($i)
}
$1 = $1
print
}
В конце концов, tolower (* какое-то пустое поле *)
- это просто пустое поле. Есть ли причина, по которой это не сработает?
Изменить: Мой вывод:
apple,orange,banana,cherry,melon,"fruit salad",grape
"Lots of vegtables",CUCUMBER,carrot,potato,radish,beetroot
Bread,BAGEL,,,,croissant