Вы просто ищете это?
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.