Заменить подстроку символов на awk и sed

Вы не можете вызвать tasksetдля записи настроек, которые будут использоваться для будущего процесса. Этот режим вызова tasksetпредназначен только для текущих -запущенных процессов.

Чтобы закрепить новый процесс на ядре, вызовите tasksetв его прямом режиме. Вы вызываете tasksetи указываете, какую программу выполнять.

taskset -c 0 python main.py

Это работает следующим образом:

  1. Оболочка (или другая вызывающая программа )создает новый процесс(fork)для выполнения (execve)taskset -c 0 python main.py.
  2. Запущенный процесс tasksetприменяет основные настройки к себе.
  3. Процесс снова выполняет(execve)python main.pyв том же процессе.

Это способ, которым другие настройки для -процесса задаются :переменными среды, когда вы устанавливаете их для одного процесса (, например. с env), а не для сеанса оболочки (, например. с export), производительность процессора с nice,перенаправления (, которые обычно выполняются с помощью синтаксиса оболочки, а не с помощью отдельной утилиты )и т. д.

0
11.07.2019, 21:48
5 ответов

С помощью GNU awk вы можете

gawk -v start=5 -v end=8 '{
    mid = substr($0, start, end-start+1)
    print substr($0, 1, start-1) gensub(/./, "N", "g", mid) substr($0, end+1)
}' file

Или с perl

perl -spe 'substr($_, $start-1, $end-$start+1) =~ s/./N/g' -- -start=5 -end=8 file

В обоих решениях мы передаем начальное и конечное значения программе с параметрами командной строки. Это упрощает изменение значений внутри сценария оболочки. Если вам нужно сделать символ замены N динамическим, это должно быть довольно очевидно, как это сделать.

2
28.01.2020, 02:15

Использование sed

Чтобы заменить символы с 5 по 8 наN:

$ sed -E 's/(.{4}).{4}/\1NNNN/' test
ABCDNNNNABCD

Как это работает:

  • (.{4})фиксирует первые четыре символа в группе 1.

  • .{4}соответствует следующим четырем символам.

  • \1NNNNзаменяет вышеуказанное на группу 1 и четыре N.

Использование GNU awk

$ gawk -F "" '{for (i=5; i<=8; i++) $i="N"} 1' OFS="" test
ABCDNNNNABCD

Как это работает:

  • -F ""указывает awk обрабатывать каждый символ как отдельное поле.

  • for (i=5; i<=8; i++) $i="N"перебирает каждый символ с 5 по 8 и заменяет его на N.

  • 1указывает awk напечатать строку.

1
28.01.2020, 02:15

Если у вас есть GNU awk (gawk ), вы можете установить FIELDWIDTHSдля разделения строки на поля на основе позиций символов. Это особенно удобно для вашего случая в версии gawk >= 4.2, которая поддерживает "подстановочный знак" в конце поля. Затем вы можете заменить символы во втором поле, используяgsub:

echo ABCDABCDABCD |./gawk -v i=5 -v n=4 '
  BEGIN {FIELDWIDTHS = sprintf("%d %d *", i-1, n)} 
  {gsub(/./,"N",$2)} 1
' OFS=""
ABCDNNNNABCD

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

echo ABCDABCDABCD | gawk -v i=5 -v n=4 '
  BEGIN {FIELDWIDTHS = sprintf("%d %d 65536", i-1, n)} 
  {gsub(/./,"N",$2)} 1
' OFS=""
ABCDNNNNABCD

См.

Фиксированная обработка -Данные ширины

Захват необязательных завершающих данных

2
28.01.2020, 02:15

Вы можете сделать это, используя следующие методы, как показано в POSIX или GNU sed

С редактором sed:

$ L=5 R=8
$ sed -e '
   s/./\n/'"$L"';s//\n/'"$R"';ta
   :a;s/\n\n/NN/;t
   s/\n./N\n/;ta
'./test

ABCDNNNNABCD

С Perl:

perl -lspe '
   my $c = $idxr - (pos()=$idxl-1);
   s/\G.{$c}/"N"x$c/e;
' -- -idxl=5 -idxr=8./test

ABCDNNNNABCD
0
28.01.2020, 02:15

Вы можете попробовать команду ниже

 echo "ABCDABCDABCD"| sed "s/ABCD/NNNN/2"

выход

ABCDNNNNABCD
0
28.01.2020, 02:15

Теги

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