Использование sed для добавления строки с символами alt - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть этот файл, с которым я хочу добавить строку, и у меня, похоже, возникла проблема при использовании символов alt. Вот фрагмент сценария:

#testfile.txt
Main
├────►projectA
└────►projectC
sed "/├────►projectA/a ├────►projectB/" testfile.txt

sed, кажется, не находит часть "├────►►projectA". Grep даже не найдет его.

grep "├────►projectA" testfile.txt

grep ничего не возвращает.

Итак, как вы можете найти его, чтобы я мог добавить свою строку под ним?

Редактировать: Я нашел свою проблему. Я использовал неправильный символ в моей команде sed. Этот скрипт находится в другой системе, поэтому мне пришлось сделать пример из головы.

Я также пытаюсь добавить пробелы после / a, но он обрезает его. Есть ли способ сохранить пробелы?
(например, «[5 пробелов] ├────►projectB»)
Я не могу добавить пробелы к приведенной выше строке, потому что форматирование stakoverflow также обрезает его. Поэтому я говорю [5 пробелов], чтобы представить количество пробелов.

Ответы [ 2 ]

0 голосов
/ 10 февраля 2020

Это может сработать для вас (GNU sed):

sed '/^├────►projectA$/{p;s/A/B/}' file

Совпадение на ────►projectA, выведите строку, заменив B на A.

Используйте sed команда l0 чтобы увидеть представление каждой строки в восьмеричном и асциемом виде.

Таким образом, это то же самое, что и выше:

sed '/^\o342\o224\o234\o342\o224\o200\o342\o224\o200\o342\o224\o200\o342\o224\o200\o342\o226\o272projectA$/{p;s/A/B/}' file

Чтобы добавить 5 пробелов перед такой строкой, используйте:

sed '/^├────►projectA$/{p;s/^/     /;s/A/B/}' file

Или вы можете предпочесть:

sed '/^\(├────►project\)A$/{p;s/     \1B/}' file
0 голосов
/ 08 февраля 2020

Мне кажется, что вы пытаетесь использовать sed для добавления литеральной строки (т.е. строки, содержащей любые символы), но sed не понимает литеральные строки, только регулярные выражения и замены с обратной ссылкой, см. Можно ли надежно избежать метасимволов регулярных выражений с помощью sed . Вместо этого вам следует использовать такой инструмент, как awk, который понимает буквальные строки.

Это все, что вы хотите сделать?

$ awk '{print} index($0,"├────►projectA"){print "├────►projectB"}' file
#testfile.txt
Main
├────►projectA
├────►projectB
└────►projectC

Если вы хотите 5 ведущих пробелов, просто добавьте 5 ведущих пробелов в строка в операторе печати:

$ awk '{print} index($0,"├────►projectA"){print "     ├────►projectB"}' file
#testfile.txt
Main
├────►projectA
     ├────►projectB
└────►projectC

Если вы просто хотите дублировать любой отступ, который имеет предыдущая строка, вот модифицированная версия вашего входного файла:

$ cat file
#testfile.txt
   Main
     ├────►projectA
     └────►projectC

и вот как чтобы напечатать новую строку с любым отступом (пробелами и / или табуляциями), который использует предыдущая строка:

$ awk '{print} s=index($0,"├────►projectA"){print substr($0,1,s-1) "├────►projectB"}' file
#testfile.txt
   Main
     ├────►projectA
     ├────►projectB
     └────►projectC
...