Используйте sed для добавления строки в определенный столбец

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

# ~/.tmuxinator/iterate.yml

name: iterate
root: ~/
windows:
  - one:
      panes:
        <%- args.each do |arg| %>
        - echo <%= arg %>
        <%- end %>
arr=(Hello World)
tmuxinator start iterate ${arr[*]}
0
18.08.2020, 20:59
4 ответа

Вы можете использовать

sed 's/.\{30\}/&213 /' InFile > OutFile

для замены первых 30 символов ("любой символ" умножить на 30 )сами по себе(&)плюс "213".

2
18.03.2021, 23:11

Вы можете использовать счетное RE. Например, x{12}соответствует 12 xсимволам, а y{1,3}соответствует 1, 2 или 3 yсимволам. Здесь мы собираемся использовать .{30}для сопоставления 30 подстановочных знаков (, то есть 30 любых символов ). \1в строке результата соответствует ссылке в квадратных скобках в сопоставлении с образцом

.
sed -r 's#^(.{30})#\1213 #' file

В своем обновленном вопросе вы теперь говорите, что перед вставкой есть 878 символов. Так что просто измените 30 в примере на 878 и вставьтеXXX

sed -r 's#^(.{878})#\1XXX#' file

Тот же процесс может применяться для любой модификации фиксированной -ширины.

Вы также можете использовать perl, который не имеет ограничений на длину строки, характерных для некоторых реализаций sed,

.
perl -pe 's#^(.{878})#$1XXX#' file
2
18.03.2021, 23:11

с использованием Раку (урожденная Perl6)

$ raku -pe 's/ (^^. ** 30) /{$0}213-/ ;'

ИЛИ

$ raku -pe 's/ (^^. ** 30) /{$0}{"213-"}/ ;'

Приведенный выше код использует оператор Raku s///. Флаг командной строки -pe (s )указывает Raku обрабатывать строку ввода -по строке -и автоматически печатать возвращаемое значение.

Примечание. :Раку обычно очень терпимо относится к пробелам в регулярных выражениях, но замещающая половина оператора s///— одно из тех мест, где стоит быть особенно осторожным. Простое использование $0 213-добавит дополнительный пробел перед строкой из четырех -символов 213-, которую вы хотели бы вставить сразу после первого поля из 30 -символов.

Решение состоит в том,:

  1. заключить захват $0в фигурные скобки, указав {$0}213-в качестве замены, или
  2. заключить захват $0и двойное -цитируемое 213-в фигурные скобки, не оставляя пробелов между ними, например:{$0}{"213-"}.

[Примечание: для всех приведенных выше примеров я использовал "213 -" (с завершающим дефисом )в качестве примера строки вставки; Я понимаю, что ОП действительно хочет ""213" (с пробелом в конце )в качестве правильной строки вставки].

https://raku.org/

0
18.03.2021, 23:11

Если вы выходите за пределы возможностей инструмента, вы можете использовать альтернативный вариант: разбить число 877 на 3 единицы по 255 и оставшиеся 112.

skip=877
cmax=255
mult=`expr "$skip" / "$cmax"`
rem=`expr "$skip" % "$cmax"`
lim=".\\{$cmax\\}"
re="\\($lim\\)\\{$mult\\}.\\{$rem\\}"

sed -e "s/$re/&XXX/"   your_file_nam

Гораздо проще использоватьPerl:

perl -lpe 'substr($_, 877) =~ s/^/XXX/'  your_file_name

питон:

python3 -c '
import sys
f, p, r = sys.argv[1:]
p = int(p)
with open(f) as fh:
  print(*[l[:p]+r+l[p:] for l in fh],sep="",end="") 
' file_name 877 "XXX"
0
18.03.2021, 23:11

Теги

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