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

У меня есть файл с именем tree.txt, в котором есть список всех узлов, однако из-за какой-то ошибки или чего-то, что многие узлы имеют неправильное имя тега. tree.txt-

Main_Overview/Ballast/BA-02:Tag=BA-02
Main_Overview/Ballast/BA-03:Tag=BA-02-1
Main_Overview/Ballast/BA-04:Tag=BA-02-2

Как видно выше, имя тега узла BA-03 и BA-04 неверно, поэтому с помощью Обработка файла в CI удалось исправить этот текстовый файл, а также распечатать все неверные теги соответствующих узлов в файле, как показано ниже. incorrect_tags.txt-

"BA-02-1" "BA-03"
"BA-02-2" "BA-04"

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

Мой подход к решению проблемы ->

  1. У меня будут две переменные node и tag, эти две переменные будут получать данные сверху invalid_tag.txt. Я буду искать значение тега в каждом файле и заменять его значением соответствующего узла.
  2. Как только я закончу поиск и замену первого тега во всех файлах, он сделает то же самое для остальных.

Однако из-за моих ограниченных знаний я не знаю, возможно ли это или нет. Также, даже если я получу некоторую помощь по синтаксису, я смогу сделать отдых. Спасибо

Редактировать-

Другие файлы, где мне нужно искать и заменять данные, разные. например, Ballast.j1

:1176:489:15:30:CompID=118680:Text=BA-02:uiFont=Arial-PLAIN-10: 
:1269:489:15:30:CompID=118681:Text=BA-02-1:uiFont=Arial-PLAIN-10:
:1013:489:15:30:CompID=118677:Text=BA-02-2:uiFont=Arial-PLAIN-10:

Есть около 2000 файлов .j1, где я буду искать каждое имя тега во всех этих файлах .j1 и заменять его на правильное имя тега или узел.

1 ответ1

1

Вы просто ищете это?

sed -i '\%/\([^/:]*\):Tag=\1%n;s%%/\(\([^/:]*\):Tag=\)[^/:-]*-[^/:-]*%\1\2%' *.j1

(Попробуйте без -i увидеть результат, не записывая его обратно в исходный файл - направьте на less чтобы можно было приостановить и прокрутить назад и вперед.)

Скобки в первом выражении ищут строку между косой чертой и двоеточием; если мы сразу обнаружим, что за ним следует Tag= и та же строка, что и в скобках, мы в порядке. Скобки с обратной косой чертой фиксируют эту строку, поэтому мы можем ссылаться на нее как \1 .

Если мы не нашли этот шаблон, строка после Tag= должна отличаться от захваченной строки; если это так, замените строку после Tag= на захваченную строку. Регулярное выражение заменяет последовательность, которая содержит одну черту и, в противном случае, не содержит тире, двоеточий или косых черт (например, непосредственно перед вторым тире или первым слешем или двоеточием).

Если вы используете * BSD (включая Mac OS), вам нужно -i '' вместо просто -i .

Для другого подхода вы можете реорганизовать ваши сопоставления в сценарий sed . Если у вас есть файл incorrect_tags.txt вроде

"BA-02-1" "BA-03"
"BA-02-2" "BA-04"

тогда вы можете запустить следующий скрипт

sed 's%^"%s/%;s%" "%/%;s%"$%/g%' incorrect_tags.txt

который производит ... еще один сценарий sed который теперь выглядит

s/BA-02-1/BA-03/g
s/BA-02-2/BA-04/g

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

Полный трубопровод тогда

sed 's%^"%s/%;s%" "%/%;s%"$%/g%' incorrect_tags.txt |
sed -i -f - *.j1

и снова, вы можете попробовать без -i сначала посмотреть, как выглядит результат. Кроме того, вашему sed может не понравиться опция -f , или он может не поддерживать чтение скрипта при стандартном вводе; возможно, затем просто сохраните вывод из первого вызова sed во временный файл и затем укажите временное имя файла в качестве аргумента имени файла для -f .

Обратите внимание, что для этого потребуется, чтобы теги не перекрывались - если вы сначала замените A на B, а затем B на C, конечный результат будет таким, как если бы вы указали "A" и "C". Обходной путь должен изменить порядок так, чтобы B сначала заменяли на C, а только потом A на B.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .