Оболочка извлекает текст перед цифрами в строке
Я нашел несколько примеров извлечения перед одним символом и примеры извлечения чисел, но я не нашел ничего о извлечении символов перед числами.
Мой вопрос: некоторые из строк у меня выглядят так:
NUC320 Syllabus Template - 8wk
SLA School Template - UL
CJ101 Syllabus Template - 8wk
TECH201 Syllabus Template - 8wk
Test Clone ID17
В тех случаях, когда строка не содержит данных, которые я хочу, мне нужно пропустить. Желаемый результат будет:
NUC-320
CJ-101
TECH-201
SLA School Template - UL
& Test Clone ID17
будет пропущен
Я представляю, что процесс является чем-то вроде:
- Извлечь текст перед
" "
- Условие - Проверить на наличие цифр в строке
- Извлекайте текст перед цифрами и назначайте его переменной
x
- Извлечение цифр и присвоение переменной
y
- Объединить
$x"-"$y
и назначить другую переменнуюz
Дополнительная информация: строки извлекаются из строки в нескольких тысячах текстовых документов с использованием цикла. Они будут использоваться для добавления гиперссылки и переименования файла во время цикла.
Редактировать:
#!/bin/sh
# my files are named 1.txt through 9999.txt i both
# increments the loop and sets the filename to be searched
i=1
while [ $i -lt 10000 ]
do
x=$(head -n 31 $i.txt | tail -1 | cut -c 7-)
if [ ! -z "$x" -a "$x" != " " ]; then
# I'd like to insert the hyperlink with the output on the
# same line (1.txt;cj101 Syllabus Template - 8wk;www.link.com/cj101)
echo "$i.txt;$x" >> syllabus.txt
# else
# rm $i.txt
fi
i=`expr $i + 1`
sleep .1
done
3 ответа
sed для печати строк, начинающихся с заглавных букв, за которыми следуют цифры. Это также добавляет -
между ними:
sed -n 's/^\([A-Z]\+\)\([0-9]\+\) .*/\1-\2/p' input
дает:
NUC-320
CJ-101
TECH-201
awk '$1 ~/[0-9]/{sub(/...$/,"-&",$1);print $1}' file
NUC-320
CJ-101
TECH-201
POSIX-совместимый awk
решение:
awk '{ if (match($1, /[0-9]+$/)) print substr($1, 1, RSTART-1) "-" substr($1, RSTART) }' \
file |
while IFS= read -r token; do
# Process token here (append to hyperlink, ...)
echo "[$token]"
done
awk
используется для извлечения переформатированных токенов, которые затем обрабатываются в оболочкеwhile loop
,match($1, /[0-9]+$/)
соответствует 1-му разделенному пробелами полю ($1
) против расширенного регулярного выражения[0-9]+$
то есть совпадает, только если поля заканчиваются одной или несколькими цифрами.substr($1, 1, RSTART-1) "-" substr($1, RSTART)
соединяет часть перед первой цифрой с помощью набора цифр, используя-
через специальныйRSTART
переменная, которая указывает позицию символа на основе 1, где самая последняяmatch()
вызов совпадает.