Вы не можете вызвать taskset
для записи настроек, которые будут использоваться для будущего процесса. Этот режим вызова taskset
предназначен только для текущих -запущенных процессов.
Чтобы закрепить новый процесс на ядре, вызовите taskset
в его прямом режиме. Вы вызываете taskset
и указываете, какую программу выполнять.
taskset -c 0 python main.py
Это работает следующим образом:
fork
)для выполнения (execve
)taskset -c 0 python main.py
. taskset
применяет основные настройки к себе. execve
)python main.py
в том же процессе. Это способ, которым другие настройки для -процесса задаются :переменными среды, когда вы устанавливаете их для одного процесса (, например. с env
), а не для сеанса оболочки (, например. с export
), производительность процессора с nice
,перенаправления (, которые обычно выполняются с помощью синтаксиса оболочки, а не с помощью отдельной утилиты )и т. д.
С помощью 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 динамическим, это должно быть довольно очевидно, как это сделать.
Чтобы заменить символы с 5 по 8 наN
:
$ sed -E 's/(.{4}).{4}/\1NNNN/' test
ABCDNNNNABCD
Как это работает:
(.{4})
фиксирует первые четыре символа в группе 1.
.{4}
соответствует следующим четырем символам.
\1NNNN
заменяет вышеуказанное на группу 1 и четыре N
.
$ 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 напечатать строку.
Если у вас есть 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
См.
Вы можете сделать это, используя следующие методы, как показано в 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
Вы можете попробовать команду ниже
echo "ABCDABCDABCD"| sed "s/ABCD/NNNN/2"
выход
ABCDNNNNABCD