Оболочка извлекает текст перед цифрами в строке

Я нашел несколько примеров извлечения перед одним символом и примеры извлечения чисел, но я не нашел ничего о извлечении символов перед числами.

Мой вопрос: некоторые из строк у меня выглядят так:

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 будет пропущен

Я представляю, что процесс является чем-то вроде:

  1. Извлечь текст перед " "
  2. Условие - Проверить на наличие цифр в строке
  3. Извлекайте текст перед цифрами и назначайте его переменной x
  4. Извлечение цифр и присвоение переменной y
  5. Объединить $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() вызов совпадает.
Другие вопросы по тегам