найти и прочитать строки в файле, затем проверить строки комментариев

Я считаю, что самый простой способ, который не предполагает изобретения велосипеда, будет sudo. Вы по-прежнему можете предоставить пользователю ограниченное количество команд, а именно systemctl restart httpd, используяvisudo

# visudo

добавить такую ​​строку:

nonprivuser ALL=(ALL) NOPASSWD: /bin/systemctl restart httpd

сохранить файл и протестировать его:

# su - nonprivuser
$ sudo /bin/systemctl restart httpd
0
25.03.2021, 08:22
2 ответа

Некоторые первоначальные мысли.

Использование цикла while readбудет медленным по сравнению с использованием, скажем,grep -qv '//'

cat | grep | grep | TR | cut |grepбудет медленным по сравнению с простым использованием sed.

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

Очевидно, поскольку у меня нет ваших данных, я не проверял это.

Итак, давайте создадим новый скрипт noncomments.sh. Этот вернет строки без комментариев. Это должно быть легко проверить, запустите его на любом файле патча и посмотрите, какие строки без комментариев -он выдает.

#!/bin/sh
# delete the +++ and --- lines from unified diff. remove lines which are not
# added/removed. remove added/removed lines which are comments or blank
# output anything that is left
sed '/^+++/d;/^---/d;/^[+-]/!d;/^.[ \t]*\/\//d;/^.[ \t]*$/d' "$@"

а затем свяжите их вместе

#!/bin/bash

find my/patch/folder -type f
-print0 | xargs -0 sh -c '
for i
do
  [ -z "$(./noncomments.sh "$i")" ] || cat "$i"
done
' > small.patch

Перенаправление выполняется только один раз.

Можно было бы еще немного изменить баланс работы, например сделать так, чтобы скрипт ничего не выводил, если изменения касались только комментариев, и весь файл, если изменений комментариев не было. Тогда команда будет просто

find my/patch/folder -type f -exec./noncommentchanges {} \; > small.patch

1
28.04.2021, 22:56

Такие сценарии в основном представляют собой набор утверждений, которые мы делаем о git разностных данных. И всякий раз, когда мы слышим утверждения, мы используем обходные пути , например, они есть в Perl механизме регулярных выражений.

find my/patch/folder -type f \
-exec perl -lne '
  tr/ \t//dr =~
  m{(?=^[-+])(?!^([-+])\1{2})(?=^.(?!//))}
    and exit 0}{exit 1
' {} \; -exec cat {} + > small.patch

Изучение регулярного выражения:

# delete indiscriminately all spaces n TABs  
tr/ \t//dr =~
m{ (?# From where I stand...)
  (?=^[-+])   (?# I can see the beginning of line to my immediate eight followed by either a plus or minus sign)
    ### AND ###
  (?!([-+])\1{2}) (?# I donot see --- or +++ string at the beginning of line)
    ###:AND ###
  (?=.(?!//))  (# I donot see // as the 2nd and 3rd characters)
}x;
## so when all 3 assertions are met,
can we say that we have seen a 
noncomment commit line and so we 
promptly exit with a Unixy success (0)
 else we wait till the eof to exit with a 
Unixy failure (1)
0
28.04.2021, 22:56

Теги

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