Использование sed для замены только первого вхождения при использовании переменной и «/» в переменной

У меня есть файл, который выглядит так

I/am/a/string
I'm/still/a/string
Always/a/string

Я пытаюсь использовать sed для замены первого вхождения «строки» на переменную, содержащую «/», например

x=ive/been/replaced

Таким образом, вывод sed будет

I/am/a/ive/been/replaced

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

sed -i "0,/string/s//$x/" file  

Однако в этом случае, поскольку переменная имеет «/», мне нужно использовать другой разделитель, например

sed "0,|string|s||$x|" file

Но это не работает.

что мне не хватает?

ПРИМЕЧАНИЕ:

Я хотел бы сделать это в sed

Вы хотите, чтобы string рассматривалось как литеральная строка или как регулярное выражение с дополнительными ограничениями на символы, которые оно может содержать? Вы хотите решение, которое работает для любого x или работает только тогда, когда x содержит некоторое подмножество символов? Если вам нужно решение, которое обрабатывает string как регулярное выражение с дополнительными ограничениями и работает только в том случае, если x не содержит некоторых символов, то вы на правильном пути, если хотите сделать это в sed. Если/когда вы хотите, чтобы он работал для буквенных строк любых символов, сообщите нам, и мы можем предоставить решение awk.

Ed Morton 31.05.2019 00:48
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
39
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Если у вас все в порядке с использованием awk: вы можете распечатать и выйти после первой замены.

awk -v x = "${x}" '{gsub(/string/,x);print ;exit}' file
I/am/a/ive/been/replaced

sed версия: это завершится после первого совпадения, обратите внимание, что строка поиска «строка» все еще находится внутри / /, тогда как часть подстановки использует другой разделитель.

sed -n   "0,/string/ s|string|$x|p"   
I/am/a/ive/been/replaced

Я пытаюсь избежать использования awk sed, это было бы короче и точнее. Если это невозможно, я понимаю, но помимо этого это съест меня заживо.

goose goose 30.05.2019 23:49

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