Понимание команды sed

Rhys Williams спросил: 13 июня 2018 в 03:31 в: bash

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

2000-01-18
Вторник
Livingston
42178

Этот конкретный файл находится в каталог с именем 18, внутри другого каталога с именем 01, который находится в другом каталоге с именем 2000, который находится в каталоге с именем filesToSort.

Мне удалось использовать этот код как консольную команду для изменения первой строки file:

perl -pi -w -e 's/2000-01-18/Test/g;' ff_1177818640

Это изменило файл на

Тест
вторник
Livingston
42178

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

perl -pi -w -e 's/*/Test/g;' ff_1177818640

Но это не так, Мне нравится это вообще.
Мой текущий процесс состоит в том, что если я могу сделать эту команду, выберите все даты в исходном входе, а затем некоторые найдут способ реализовать p athname во вторую часть, где у меня в настоящее время есть "Тест", используя что-то вроде этого:

path=/filesToSort/2000/01/18/ff_1177818640
file=$(basename "$path")

Я должен теоретически иметь возможность запускать весь этот код через родительский каталог и все подкаталоги , поэтому изменяя каждое значение даты в файлах, которые появляются в строке 1 каждого отдельного файла, в этих каталогах, чтобы отразить путь к файлу, в котором они находятся, эффективно превращает файл, который выглядит следующим образом:

2000-xx-18
Вторник
Livingston
42178

Содержится в каталоге / filesToSort / 2000/01 / 18into this:

2000/01/18
Вторник
Livingston
42178

Я не уверен, что я просто использую команду sed неправильно здесь и что есть другая команда, которую я должен использовать вместо этого, но я пытался заставить это работать в течение 4 часов, и я не могу прибить его. Спасибо заранее за помощь!

2 ответа

Andre Gelinas ответил: 13 июня 2018 в 04:31

Полагает, что то, что вы хотите сделать, в основном переводит "-" для "/". Вы можете найти файл, взять его резервную копию (всегда хорошая идея), а затем использовать:

    sed 's|-|/|g' <path/backup_file >path/modified_file

При этом, если это одно и то же задание, вы можете использовать это команду скопировать в свой новый каталог и одновременно изменить файл.

Beta ответил: 13 июня 2018 в 04:38
Это предполагает, что даты в файлах точны.
Andre Gelinas ответил: 13 июня 2018 в 05:06
Ну, это то, что говорит OP в файлах ... а также, эти файлы были размещены в этих каталогах на основе этой первой строки в соответствии с предыдущим сообщением ... Nice sed, чтобы получить внутренний каталог.
Beta ответил: 13 июня 2018 в 06:58

Вы не отправили команду sed, поэтому трудно понять, что будет работать. Давайте сделаем это небольшими шагами. Попробуйте следующее:

sed -i '1s/^/X/' ff_1177818640

и посмотрите, изменит ли этот файл файл (добавив "X" в начало первой строки). Если ваша версия sed не нравится, попробуйте следующее:

sed -i "" '1s/^/X/' ff_1177818640

После того, как вы используете синтаксис, мы должны решить проблему преобразования пути в дату. Попробуйте следующее:

echo some/path/filesToSort/2000/01/18/ff_1177818640 | sed 's|.*/filesToSort/||; s|/[^/]*$||'

Если это создает "2000/01/18", опубликуйте комментарий, и мы можем собрать все это вместе.

EDIT: все вместе. Абракадабра!

find . -type f -exec sed -i "1{s|.*|{}|;s|.*/filesToSort/||;s|/[^/]*$||;}" {} \;
Rhys Williams ответил: 13 июня 2018 в 05:06
Я просто получил этот кусок кода, когда я попытался выполнить поиск в Интернете, как это сделать, и подумал, что команда sed является частью синтаксиса или чего-то. Первая команда sed, которую вы предоставили, работала и добавила X к началу строки, затем команду echo дал это как результат / testarea / 2000/01/18 Я переместил файлы на "testarea", пока я просто не запутался.
Rhys Williams ответил: 13 июня 2018 в 05:10
Главное, что я пытаюсь достичь с помощью этой команды sed, - это взять путь к файлу и использовать его для изменения даты внутри файла, у меня есть файлы с датами, содержащими нулевые значения "x", например, 2000-xx-18 in / filesToSort / 2000/01/18, и я пытаюсь использовать эту команду sed, чтобы взять дату 2000-01-18 из пути к файлу и заменить строку даты внутри файлов этим путем
Rhys Williams ответил: 13 июня 2018 в 05:12
Извините, эта команда эха дала мне точный результат, который вы сказали
Rhys Williams ответил: 13 июня 2018 в 05:46
я бы использовал какой-то цикл for, чтобы сказать, как для каждого файла с xx in, конвертировать его в путь к файлу?
Beta ответил: 13 июня 2018 в 07:02
@RhysWilliams: Не только файлы с "xx", но и все файлы. Команда find, которую я только что добавил, заменяет первую строку каждого файла (под рабочим каталогом) строкой, построенной из пути. Постскриптум Обратите внимание, что я жестко закодировал "filesToSort" как имя верхнего каталога в дереве; вы можете изменить это на "testarea" или что бы вы ни использовали.

Дополнительное видео по вопросу: Понимание команды sed

Sed и awk — Виктор Ашик

Linux команда sed - редактор текстовых файлов.

LPIC 103.7 Регулярные выражения в Linux