Присвойте значения переменной из текстового файла. Поиск строки в файле. Заменить строку в файле?

271
gadhvi

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

У меня есть файл с именем 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 и заменять его на правильное имя тега или узел.

0
Все, что вы пытаетесь сделать, это взять каждый файл (например, Main_Overview / Ballast / BA-04) и выполнить поиск и заменить BA-02-2 -> BA-04 в этом файле? davidgo 6 лет назад 0
Вы хотите сказать, что Main_Overview / Ballast / BA-03: Tag = BA-02-1 следует переписать следующим образом: Main_Overview / Ballast / BA-03: Tag = BA-03 и другие должны, Main_Overview / Ballast / BA- 04: Tag = BA-04? Rajesh S 6 лет назад 0
@ davigo Мне просто нужно заменить все неправильные имена тегов, присутствующие в других файлах, которые я упомянул сейчас, так как мне нужно сначала узнать, какие из них неправильные и какое точное имя. Я создал текстовый файл, упомянутый во втором блоке, который содержит сначала старое имя тега, а затем новое имя тега. gadhvi 6 лет назад 0

1 ответ на вопрос

1
tripleee

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

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.

Спасибо, но я уже выполнил эту часть, используя C, последняя оставшаяся часть - мне нужно заменить эти старые неправильные имена тегов новыми, но эти файлы отличаются, я упомянул об этом сейчас, и там почти 2k файлов. gadhvi 6 лет назад 0
Смотрите обновление сейчас. Использование C для такого рода вещей, вероятно, неправильно направлено, но если вы уже проделали эту работу, вы могли бы также использовать результаты. tripleee 6 лет назад 0
спасибо огромное, я никогда не думал, что sed настолько мощен, что мне нужно будет узнать о нем больше. gadhvi 6 лет назад 0

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