Как удалить определенный шаблон из определенных строк с помощью bash

Я хочу удалить шаблон \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

Я знаю, как удалить шаблон из всех строк, но я не знаю для конкретной строки.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
45
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Во-первых, сохранение строки в переменной без кавычек заставляет оболочку анализировать значение перед назначением переменной, поэтому одна из ваших обратных косых черт уже исчезнет к тому времени, когда переменная будет назначена. 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 '' с обязательным, но необязательно пустым аргументом.)

Я использую Ubuntu 14.04, я пробовал с вашей командой, она не работает @tripleee

Biki Teron 22.06.2019 18:02

Извините, попробуйте сейчас; в шаблоне, который я скопировал/вставил из вашего кода, была опечатка. Также в вашем примере этот текст находится в строках 2 и 4, а не в 1 и 3. Демонстрация: ideone.com/EL2TZT

tripleee 22.06.2019 18:13

Он удаляет другие альтернативные строки, любезно изменив код, пожалуйста. @tripleee

Biki Teron 22.06.2019 19:39

@BikiTeron Мои извинения; Я исправил уг сейчас (b против n).

tripleee 23.06.2019 09:39

Большое спасибо, теперь все работает нормально @tripleee

Biki Teron 23.06.2019 17:57

Попробуйте использовать одинарные кавычки вместо двойных, например:

sed '1s/\\textcolor{red}{//;3s/\\textcolor{red}{//'

Правила для одинарных и двойных кавычек разные: Разница между одинарными и двойными кавычками в Bash

Двойные кавычки будут интерпретировать символ обратной косой черты и заменят \\ на \ к тому времени, когда он доберется до sed, поэтому sed увидит \t вместо \\t.

$  echo '\\'
\\
$ echo "\\"
\

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

tripleee 23.06.2019 19:22

Вы совершенно правы, мой плохой, спасибо, что указали на это. Что лучше всего делать в этом случае, следует ли мне отредактировать свой ответ или удалить его?

Mark 23.06.2019 19:58

Другие вопросы по теме