последовательно пронумеровать строку связанных изображений с помощью vim или другого?

Вы можете сделать это, используя bashи массивы, как показано:

#!/bin/bash

# store the numerically sorted file1 into array A
A=( $(sort -t/ -k1,1n -k2,2n < file-1) )

# determine the maximum field width by examining the lengths of the 2nd field
# and the string "VLAN-NAME" coming for the header.
maxW=$(
         { echo ',"VLAN-NAME"'; cat < file-2; } |
         cut -d, -f2 | awk '{print length-2}' |
         sort -nr | sed q
      )

# first two fields of the header
B=( "VLAN-ID " "$(printf " %-${maxW}s\n" "VLAN-NAME")" )

# complete header: from array B and the numerically sorted file1 contents
C=( "${B[@]}" "$(IFS="|"; echo "${A[*]}")" )

# display the header
echo "$(IFS="|"; echo "${B[*]}")" |\
sed -e 's/[^[:blank:]]/ /g;s/$/|   interface switch/'
echo "$(IFS="|"; echo "${C[*]}")"

# remaining lines printed
while IFS=, read -ra B; do
   D=(x)
   for arg in "${A[@]}"; do
      case " ${B[*]:2} " in *" $arg "* ) res=* ;; * ) res=\ ;; esac
      var1=${arg//[!\/]/ } D=( "${D[@]}" "${var1/\//$res}" )
   done
   printf "%8s| %${maxW}s|%s\n" "${B[0]}" "${B[1]//\"/}" "$(IFS="|";echo "${D[*]:1}")"
done < file-2

Результаты

                    |   interface switch
VLAN-ID | VLAN-NAME |1/1|1/2|1/3|1/4|1/5|1/6|1/7|1/8|1/9|1/10|3/3
       1|  vlan-wifi| * |   |   |   |   |   | * | * |   |    |
       2| vlan-admin|   |   | * |   | * | * |   |   |   |    |
       3|           |   |   | * |   |   |   |   |   |   |    | *
0
17.03.2016, 06:29
1 ответ

Решение Vim

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

:put =range(34,160)
:%s,\(.*\),<a class='gallery' href="galimages/boards/board\1.jpg" alt="board large"><image src ="galimages/boards/thumbs/\1.jpg" alt="board thumb"></a>

N.B. put создает пустую строку в первой строке, поэтому вам придется удалить ее вручную.

Объяснение

  • : put = range (34,160) : Создайте диапазон чисел от 34 до 160, по одному в каждой строке. Как уже отмечалось, это фактически начинает документ с пустой строки, поэтому удалите его вручную сейчас или позже.
  • :% s, FOO, BAR : по всему документу (% ) выполните поиск и замените ( s ), заменив FOO с BAR .
  • FOO : \ (. * \) . Замените всю строку (. * ), но сохраните содержимое (номер) в группе захвата, то есть \ (... \) .
  • BAR : при необходимости замените строкой, используя число в двух местах ( \ 1 ), чтобы создать заключительные строки.

Решение оболочки

Вы можете использовать аналогичную стратегию в оболочке без использования vim .

$ seq 34 160 | sed 's,\(.*\),<a class='\''gallery'\'' href="galimages/boards/board\1.jpg" alt="board large"><image src ="galimages/boards/thumbs/\1.jpg" alt="board thumb"></a>,'

Explanation

  • seq 34 160 : Создайте диапазон чисел от 34 до 160, по одному в каждой строке.
  • sed… : заменить, как указано выше. N.B.поскольку я цитирую аргумент sed с помощью ', этот сценарий экранирует встроенные ' с помощью '\' '.
3
28.01.2020, 02:27

Теги

Похожие вопросы