Я хочу удалить шаблон \textcolor{red}{
и заменить }}
на }
из списка конкретных строк, используя bash
Скажем, у меня есть файл
кошка A.txt
\ParallelLText{\jverse{5}\textcolor{red}{“Ahut isi inut chili kerik abang chili rik damlo. Alangli chili kerik ahut penang achili ke tovar akungsi klolo, lapen la aphan dongpon long-lo lapen nampi avo atum vangsi chongthok-et-lo.}}{\jverse{5}\textcolor{red}{“A sower went out to sow his seed; and as he sowed, some fell on the path and was trampled on, and the birds of the air ate it up.}}
\ParallelLText{\jverse{6}\textcolor{red}{Lapen akaprek achili ke longpak athak klolo, lapen lake kechingjok pen mamat chekedulo, pima hadak longle kecham avedet-lo.}}{\jverse{6}\textcolor{red}{Some fell on the rock; and as it grew up, it withered for lack of moisture. }}
\ParallelLText{\jverse{7}\textcolor{red}{Akaprek achili ke ingsu kethe arong ajosi klolo, lapen ingsu kethe arong la pen the rap-rapsi la aphan petthip-lo.}}{\jverse{7}\textcolor{red}{Some fell among thorns, and the thorns grew with it and choked it.}}
\ParallelLText{\jverse{8}\textcolor{red}{Jisu halatum aphan thak-lo, “Arnam Arat akepatu alam kechiniji, lake nangtum aphan nangpitang-lo, bonta akaprek atum aphan ke lamlir pensi thanlo. Lasi latum thek longbom setta thek longledetji lapen arjubom setta chini nedetji.” }}{\jverse{8}\textcolor{red}{He said, “To you it has been given to know the secrets of the kingdom of God; but to others I speak in parables, so that‘looking they may not perceive, and listening they may not understand.’}}
\ParallelLText{\jverse{9}\textcolor{red}{“Bonta Lamlir athe lahelo: Chili ke Arnam alamlo.}}{\jverse{9}\textcolor{red}{“Now the parable is this: The seed is the word of God.}}
\ParallelLText{\jverse{10}\textcolor{red}{Tovar akung keklo achili ke karjulong atumlo; latum kroikredetsi kejok kelongledetji aphan Diabol vangsi halatum aning arlo pen alam pondet-lo.}}{\jverse{10}\textcolor{red}{The ones on the path are those who have heard; then the devil comes and takes away the word from their hearts, so that they may not believe and be saved.}}
Допустим, у меня есть список строк для удаления шаблона: строка 1 и строка 3. поэтому мой окончательный вывод после удаления и замены шаблона будет
\ParallelLText{\jverse{5}“Ahut isi inut chili kerik abang chili rik damlo. Alangli chili kerik ahut penang achili ke tovar akungsi klolo, lapen la aphan dongpon long-lo lapen nampi avo atum vangsi chongthok-et-lo.}{\jverse{5}“A sower went out to sow his seed; and as he sowed, some fell on the path and was trampled on, and the birds of the air ate it up.}
\ParallelLText{\jverse{6}\textcolor{red}{Lapen akaprek achili ke longpak athak klolo, lapen lake kechingjok pen mamat chekedulo, pima hadak longle kecham avedet-lo.}}{\jverse{6}\textcolor{red}{Some fell on the rock; and as it grew up, it withered for lack of moisture. }}
\ParallelLText{\jverse{7}Akaprek achili ke ingsu kethe arong ajosi klolo, lapen ingsu kethe arong la pen the rap-rapsi la aphan petthip-lo.}{\jverse{7}Some fell among thorns, and the thorns grew with it and choked it.}
\ParallelLText{\jverse{8}\textcolor{red}{Jisu halatum aphan thak-lo, “Arnam Arat akepatu alam kechiniji, lake nangtum aphan nangpitang-lo, bonta akaprek atum aphan ke lamlir pensi thanlo. Lasi latum thek longbom setta thek longledetji lapen arjubom setta chini nedetji.” }}{\jverse{8}\textcolor{red}{He said, “To you it has been given to know the secrets of the kingdom of God; but to others I speak in parables, so that‘looking they may not perceive, and listening they may not understand.’}}
\ParallelLText{\jverse{9}\textcolor{red}{“Bonta Lamlir athe lahelo: Chili ke Arnam alamlo.}}{\jverse{9}\textcolor{red}{“Now the parable is this: The seed is the word of God.}}
\ParallelLText{\jverse{10}\textcolor{red}{Tovar akung keklo achili ke karjulong atumlo; latum kroikredetsi kejok kelongledetji aphan Diabol vangsi halatum aning arlo pen alam pondet-lo.}}{\jverse{10}\textcolor{red}{The ones on the path are those who have heard; then the devil comes and takes away the word from their hearts, so that they may not believe and be saved.}}
Я пробовал с этой командой, но она не работает
VAR=\\texcolor{red}{
sed -i "1s/$VAR//;3s/$VAR//" A.txt
Я знаю, как удалить шаблон из всех строк, но я не знаю для конкретной строки.
Во-первых, сохранение строки в переменной без кавычек заставляет оболочку анализировать значение перед назначением переменной, поэтому одна из ваших обратных косых черт уже исчезнет к тому времени, когда переменная будет назначена. sed
требуется две обратные косые черты, чтобы соответствовать буквальной обратной косой черты в регулярном выражении. Но самое простое решение здесь, вероятно, вообще не использовать переменную.
В sed
нет возможности адресовать несколько несмежных строк; но простой обходной путь - перечислить все строки и перейти к подпрограмме, если вы находитесь на любой из этих строк.
sed -i '
1ba
3ba
# Any other line, we are done
b
:a
s/\\textcolor{red}{//
s/}}/}/' A.txt
На языке sed
:
объявляет буквенно-цифровую метку, а b
этикетка переходит к этой метке. Просто b
переходит в конец сценария.
(Как обычно, если вы работаете на платформе *BSD, включая MacOS, вам нужно -i ''
с обязательным, но необязательно пустым аргументом.)
Извините, попробуйте сейчас; в шаблоне, который я скопировал/вставил из вашего кода, была опечатка. Также в вашем примере этот текст находится в строках 2 и 4, а не в 1 и 3. Демонстрация: ideone.com/EL2TZT
Он удаляет другие альтернативные строки, любезно изменив код, пожалуйста. @tripleee
@BikiTeron Мои извинения; Я исправил уг сейчас (b
против n
).
Большое спасибо, теперь все работает нормально @tripleee
Попробуйте использовать одинарные кавычки вместо двойных, например:
sed '1s/\\textcolor{red}{//;3s/\\textcolor{red}{//'
Правила для одинарных и двойных кавычек разные: Разница между одинарными и двойными кавычками в Bash
Двойные кавычки будут интерпретировать символ обратной косой черты и заменят \\ на \ к тому времени, когда он доберется до sed, поэтому sed увидит \t
вместо \\t
.
$ echo '\\'
\\
$ echo "\\"
\
Это верно как таковое; но из-за опечатки в переменной она вообще не работала. Если бы OP настаивал на использовании переменной, они должны были бы использовать одинарные кавычки вокруг значения в назначении или поставить (я думаю) четыре обратных слэша. Тогда двойные кавычки были бы обязательными - переменные не заменяются внутри одинарных кавычек.
Вы совершенно правы, мой плохой, спасибо, что указали на это. Что лучше всего делать в этом случае, следует ли мне отредактировать свой ответ или удалить его?
Я использую Ubuntu 14.04, я пробовал с вашей командой, она не работает @tripleee