Сценарий оболочки к строке замены в нескольких файлах в рамках выбранных каталогов

Похож на Ваш $PATH, пусто. Попробовать echo $PATH, вывод должен быть подобен этому:

/usr/local/sbin:/sbin:/usr/sbin:/bin:/usr/bin:/usr/bin/X11:/usr/local/bin:/usr/bin:/usr/X11R6/bin:/root/bin

В противном случае необходимо проверить Ваш .bash_profile или .bashrc. Или если Вы используете su username управляйте для переключения пользователей, необходимо использовать su - username в следующий раз.

3
28.05.2014, 15:19
3 ответа
[1184232] Во-первых, танца tmp-файла можно избежать, используя [1184646]sed -i[1184647] с GNU [1184648]sed[1184649] или [1184650]sed -i ''[1184651] с заменой FreeBSD (заменой на месте).

grep -R[1184653] может принимать несколько путей в командной строке, поэтому если вы уверены, что ни один из путей не содержит пробелов, вы можете заменить [1184654]$(grep -l -Re "$searchstring" "$filepath")[1184655] на [1184656]$(grep -l -R "$searchstring" $(cat path_list))[1184657].

Это будет неудачно, если любой из путей будет содержать пробелы, табуляции или глобус, но и оригинальный тоже.

Намного более надежный подход использует [1184658]find[1184659] и просто применяет sed ко всем файлам, доверяя ему не изменять файлы без совпадений (здесь предполагается, что оболочка [1184660]bash[1184661]):

Но это не дает вам никакой обратной связи о том, какие файлы он модифицирует.

Более длинная версия, которая дает Вам обратную связь:

3
27.01.2020, 21:12
[1184252]С помощью GNU tools

(Не забудьте процитировать свои переменные, оставив переменную без кавычек - оператор split+glob)[1184255]
3
27.01.2020, 21:12
[1184921] Это самый портативный способ, хотя он все еще полагается на [1185311] в основном [1185312] портативный [1185313]/dev/fd/0[1185314] для [1185315].dot[1185316]. Однако без него можно использовать один файл. В любом случае, он в основном полагается на эту функцию оболочки, которую я написал на днях:

Сначала я покажу, как она работает, потом объясню, как. Итак, я создам базу тестовых файлов:

которая создаст кучу файлов, каждый из которых будет назван под номером 1-10, который он содержит:

Это разделенный запятыми список файлов в моем тестовом каталоге, каждый из которых [1185317]? [1185318], представляющий собой новую строку.

Каждый файл содержит только один номер. Теперь я сделаю замену [1185319]grep[1185320]:

Теперь, когда я...

Все файлы

одинаково [1185323]ИЗМЕНЯЮТСЯ[1185324]. Это также работает рекурсивно. Хорошо, теперь я объясню, как.

Во-первых, думаю, функция:

начинается с [1185798]:n[1185799]ext label

\|[1185801]address[1185802]|[1185803] аргумент [1185804]$1[1185805] - маркер

, если текущая строка - [1185806]! [1185807] не совпадает [1185808] { добавляется к [1185928]H[1185929] старому буферу

  • , если текущая линия составляет [1185930]! [1185931] не [1185932] $[1185933] последняя строка [1185934] {
  • перезапишите текущую строку на [1185936]n[1185937] внешнюю строку

b[1185939] ранчо обратно на [1185940]: n[1185941]ext label

}}

else if current line is [1185812]$[1185813]last line [1185814]l[1185815]ook at pattern space

else e[1185816]x[1185817]change of hold and pattern buffers and. ...

l[1185819]ook однозначно на шаблоне пространства

Это первое [1185337]sed[1185338] утверждение - и это в основном мясо и картофель. Мы вообще никогда не [1185339]p[1185340] не прорисовывали пространство образца - мы только [1185341]l[1185342]ook на него смотрим. Так POSIX определяет функцию [1185343]l[1185344]: [1184942]. [1184943] [1185345] [2addr] [1185820]l

(Буква эл.) [1185823] Запишите пространство для образца на стандартный выходной сигнал в визуально однозначной форме. Символы, перечисленные в Базе Определения объема ИВЭЭ Стд 1003.1-2001, таблица 5-1, Побег Последовательности и связанные с ними действия [1185824]( '\\', '\a', '\b', '\f', '\r', '\t', '\v' )[1185825] записываются в виде соответствующей экранирующей последовательности; [1185826] '\n'[1185827]. в этой таблице неприменимо. Символы, не включенные в эту таблицу, не печатаются. таблица пишется в виде одного [1185828] трехзначного [1185829] восьмеричного числа (с указанием предшествующая [1185830]\[1185831]обратная косая черта) для каждого байта в символе (наиболее значительный Сначала байт). Длинные линии должны быть сложены, с точкой сгибания указывается путем написания [1185832]\[1185833]обратной косой черты, за которой следует [1185834]\n[1185835]ewline; длина при котором происходит складывание, не определено, но должно быть уместно, чтобы выходное устройство. Конец каждой строки должен быть отмечен знаком [1185836] "$" [1185837].

Так что если я сделаю:

Я не собираюсь делать тот же уровень детализации, но в основном следующее утверждение [1185353]sed[1185354]:

cd -- '--Recovery Files'

Если линия начинается с маркера [1185838]$1[1185839]. ...

cd -- '--Recovery Files'

Тянет в внешней линии [1185840]N[1185841]до тех пор, пока текущая линия не оканчивается на [1185842]$

  1. Если нужно было сделать то же самое, то снимается обратный слеш [1185844]\[1185845]обратный слеш и [1185846]\n[1185847]символ оси в верхней строке.
  2. Затем он удаляет обратный слеш [1185848]$
находит любой [1185850] \[1185851] обратный слеш, за которым следует число, которому не предшествует другой [1185852] \[1185853] обратный слеш и вставляет ноль

Ищет любые [1185854]'[1185855] одинарные кавычки и удваивает- заключает их в кавычки

Наконец, он окружает всю строку единственными кавычками [1185856]'[1185857]

Итак, теперь, когда я это сделаю:

Я понял:

Остальное вроде как легко. Это зависит от того, что строка [1185369]././[1185370] разрешится, но это произойдет только в выводе [1185371]find/grep[1185372] во главе каждого имени пути - так что это станет моим маркером [1185373]$1[1185374].

I [1185375]-exec grep[1185376] из [1185377] find[1185378] и укажите [1185379]-l[1185380] для него, чтобы он выводил имена файлов для тех файлов, которые содержат регекс.

Я вызываю функцию и получаю ее выход.

Я затем [1185381]\[1185382]обратный слеш экранирует каждый символ в ее выходе для [1185383]xargs[1185384]. И с помощью [1185385] printf[1185386] я пишу сценарий к файлу [1185387] |pipe[1185388] - который я [1185389].dot[1185390] источник как [1185391]/dev/fd/0[1185392]. Я определяю переменную [1185393]f[1185394] как ее текущий аргумент - мое имя - и [1185395]cat[1185396], который [1185397]$f[1185398] аргумент к [1185399]<<[1185400]heredocument, который подается в [1185401]sed[1185402], и [1185403]sed[1185404] записывает обратно над исходным файлом. Это может включать в себя временные файлы - это зависит от вашей оболочки. [1185405] bash[1185406] и [1185407]zsh[1185408] выпишут временную папку на каждый наследственный документ - но они их тоже убирают. [1185409]тире [1185410], с другой стороны, просто напишут наследственный документ на анонимный [1185411]|pipe[1185412].

Но важно то, что файл должен быть полностью прочитан до его записи - так работают наследственные документы и подмена команд.[1184972].

1
27.01.2020, 21:12

Теги

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