Нет, нет никакой потребности во владельце файла принадлежать группе того файла. Там не существует никакой механизм для проверки или осуществления этого. Кроме того, пользователь мог принадлежать группе когда-то и затем быть удален; ничто не пройдет файловую систему для проверки на файлы, которые были бы в конфликте.
В основном метаданные владельца и группы для файла просто находятся там на диске и не имеют никаких внешних ссылок. (Касательная: это хранится числовым идентификатором пользователя и идентификатором группы, и они разрешены системой при выяснении.)
Кроме того, только один набор полномочий когда-либо используется за один раз — если Вы - владелец, только на полномочия владельца смотрят, и полномочия группы не имеют значения. Если Вы не владелец, но находитесь в группе, полномочия группы используются. Наконец, если Вы не находитесь в группе, ни владельце, "другие" полномочия используются. Если Вы - и владелец файла и в группе файла, биты группы не имеют значения.
tail -f logfile |grep -m 1 "Server Started" | xargs echo "" >> /dev/null ;
Чтобы редактировать файлы на месте, добавьте опцию [119785]-i[119786] к [119787]perl[119788]:
Или рекурсивно:
-p[119790] необходимо обработать входную строку за строкой, оценить выражение, переданное в [119791]-e[119792] для каждой строки и вывести его на печать. Для каждой строки подставляем (используя оператор [119793]s/re/repl/flags[119794]) [119795]instant[119796] для себя ([119797]$&[119798]) и инкрементированное значение переменной [119799]++$n[119800]. Флаг [119801]g[119802] делает замену глобально (не один раз), а [119803]e[119804] так, чтобы замена интерпретировалась как код perl к [119805]e̲[119806] значению (не фиксированная строка).
Для редактирования на месте, где один вызов perl обрабатывает более одного файла, мы хотим, чтобы [119807]$n[119808] сбрасывалось в каждом файле. Вместо этого мы используем [119809]$n{$ARGV}[119810] (где [119811]$ARGV[119812] - обрабатываемый в настоящее время файл).
sed
действительно не лучший инструмент для работы, вам нужно что-то с лучшими возможностями написания сценариев. Вот несколько вариантов:
perl
perl -000pe 's / Instant / $ &. $. / e 'file
-p
означает «печатать каждую строку» после применения любого сценария, заданного с помощью -e
. -000
включает «режим абзаца», поэтому записи (строки) определяются последовательными символами новой строки ( \ n
), это позволяет правильно обрабатывать строки с двойным интервалом. $ &
- последний найденный шаблон, а $.
- номер текущей строки входного файла. e
в s /// e
позволяет мне оценивать выражения в операторе подстановки.
awk (предполагается, что ваши данные в точности такие, как показано, с тремя полями, разделенными пробелами)
awk '{if (/./) print $ 1, $ 2 ++ k, $ 3; else print} 'file
Здесь мы увеличиваем переменную k
k
, только если текущая строка не пуста /./
в этом случае мы также печатаем необходимую информацию. Пустые строки печатаются как есть.
различные оболочки
n = 0; пока читаем -r a b c; сделать
если ["$ a"]; затем
((n ++))
printf "% s% s% s% s \ n" "$ a" "$ b" "$ n" "$ c"
else
printf "% s% s% s \ n" "$ a" "$ b" "$ c"
fi
done
Здесь каждая строка ввода автоматически разделяется на пробелы, а поля сохраняются как $ a
, $ b
и $ c
. Затем внутри цикла $ c
увеличивается на единицу для каждой строки, для которой $ a
не является пустым, и его текущее значение печатается рядом со вторым полем, $ b
.
ПРИМЕЧАНИЕ: все вышеперечисленные решения предполагают, что все строки в файле имеют один и тот же формат. Если нет, ответ @Stephane - это то, что вам нужно.
Для работы со многими файлами и при условии, что вы хотите сделать это для всех файлов в текущем каталоге, вы можете использовать следующее:
for file in ./*; do perl -i -000pe 's/instant/$& . $./e' "$file"; done
ВНИМАНИЕ: это предполагает простые имена файлов без пробелов, если вам нужно разобраться с чем-то более сложным, используйте (при условии ksh93
, zsh
или bash
):
find . -type f -print0 | while IFS= read -r -d ''; do
perl -i -000pe 's/instant/$& . $./e' "$file"
done
Если вы хотите решить эту проблему с помощью sed
, вы можете использовать что-то вроде этого (вbash
):
i=0
while read -r line; do
sed "s/\(instant\)/\1${i}/" <<< "${line}"
[[ ${line} =~ instant ]] && i=$(( i + 1 ))
done < file
или более переносимым решением будет:
i=0
while read -r line; do
echo "${line}" | sed "s/\(instant\)/\1${i}/"
if echo "${line}" | grep -q inst; then
i=$(( i + 1 ))
fi
done < file