У меня есть файл, который выглядит так
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
Если у вас все в порядке с использованием 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, это было бы короче и точнее. Если это невозможно, я понимаю, но помимо этого это съест меня заживо.
Вы хотите, чтобы
string
рассматривалось как литеральная строка или как регулярное выражение с дополнительными ограничениями на символы, которые оно может содержать? Вы хотите решение, которое работает для любогоx
или работает только тогда, когдаx
содержит некоторое подмножество символов? Если вам нужно решение, которое обрабатываетstring
как регулярное выражение с дополнительными ограничениями и работает только в том случае, еслиx
не содержит некоторых символов, то вы на правильном пути, если хотите сделать это в sed. Если/когда вы хотите, чтобы он работал для буквенных строк любых символов, сообщите нам, и мы можем предоставить решение awk.