вставка числа из stdout в строку из stdout - PullRequest
1 голос
/ 27 октября 2019

Я работаю на терминале Linux. У меня есть строка, за которой следует число в качестве stdout, и мне нужна команда, которая заменяет середину строки на число и записывает результат в stdout.

Это строка и число: библиотекарь 16, и эточто должно быть получено: l16n

Я попытался использовать echo librarian 16|sed s/[a-z]*/16/g, и это дает мне 9 999, проблема в том, что он заменяет каждую букву сепаритали и что он также заменяет первую и последнюю букву, и что я могу 'чтобы он использовал номер из stdout.

Я также пытался использовать cut -c 1-1, sed s/[^0-9]*//g и cut-c 9-9 для генерации l, 16 и n соответственно, но я не могу найти, как объединить их выводыв одну строку.

Наконец, я пытался использовать текстовые редакторы, чтобы скопировать число и вставить его в строку, но я не добился большого прогресса, так как я не знаю, как использовать редакторы непосредственно из командылиния.

1 Ответ

1 голос
/ 27 октября 2019

Итак, вы хотите захватить первую букву, последнюю букву и число, игнорируя при этом середину.

В регулярном выражении мы используем ( и ), чтобы сообщитьдвигатель, который мы хотим захватить, все остальное просто подбирается, или «съедается», но не захватывается. Таким образом, шаблон должен выглядеть следующим образом:

([a-z])[a-z]*([a-z]) ([0-9]+)
  • ([a-z]) для захвата первой буквы
  • [a-z]* для соответствия нулю или более символов, но не захватывать . Здесь мы выбираем «*», потому что в середине может не быть совпадений, например, когда есть две или менее букв.
  • ([a-z]) для захвата последней буквы.
  • «съесть» пробел.
  • ([0-9]+), чтобы захватить номер. Мы используем + вместо *, поскольку нам требуется число в этой позиции.

sed использует другой синтаксис для некоторых этих конструкций, поэтому мы будемиспользуйте флаг -E. Вы можете обойтись без него, но вам придется избегать ()+ символов, которые IMO делает шаблон немного запутанным.

Теперь, чтобы извлечь захваченный контент, мы должны использовать специфическую для движка последовательностьперсонажи. sed использует \n, где n - номер группы захвата, поэтому наш окончательный шаблон должен выглядеть следующим образом:

\1\3\2
  • \1: первая буква
  • \3: номер
  • \2: последняя буква

Теперь мы собрали все вместе:

$ echo librarian 16|sed -r 's/([a-z])[a-z]*([a-z]) ([0-9]+)/\1\3\2/g'
l16n
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...