
У меня есть файл, в котором есть RESOURCE
ключевое слово. Оно может встречаться в любом месте файла, например:
[email protected]
Теперь я хочу заменить [email protected]
на [email protected]
. Мне нужно найти строку, где я могу найти RESOURCE
ключевое слово, а затем заменить слово после знака равенства. RESOURCE
Ключевое слово должно остаться неизмененным.
Может ли кто-нибудь мне помочь в этом вопросе?
вход:
[email protected]
Выход:
[email protected]
решение1
grep
в данном случае бесполезен, так как не позволяет изменять содержимое файла.
Вместо этого можно использовать sed
так:
fromaddr='[email protected]'
toaddr='[email protected]'
sed '/^RESOURCE=/s/='"$fromaddr"'$/='"$toaddr"'/' file >newfile
Дано file
как
some data
[email protected]
[email protected]
[email protected]
[email protected]
more data
это создает newfile
как
some data
[email protected]
[email protected]
[email protected]
[email protected]
more data
Выражение sed
выберет строки, начинающиеся со строки RESOURCE
. Для каждой такой строки оно заменит адрес электронной почты, если он присутствует в строке. Шаблон, используемый для замены, гарантирует, что мы сопоставляем =
и что адрес заканчивается в конце строки.
решение2
Команда sed
лучше.
sed -i 's/[email protected]/[email protected]/' yourfile
Вышеуказанный вариант сработал в моем тесте, но если вы хотите проверить это самостоятельно, то можете сначала попробовать этот:
sed 's/[email protected]/[email protected]/' yourfile
Это запишет изменения в стандартный вывод, не затрагивая файл.
В любом случае, это даст желаемое изменение:
[email protected]
Если значение RESOURCE
в файле отличается и вы хотите изменить его на что-то другое, то:
grep RESOURCE= yourfile
Это вернет строку туда, где она находится, и покажет значение.
Затем вы можете использовать
sed 's/[email protected]/[email protected]/' yourfile
На будущее важно четко указать все это в вашем первоначальном вопросе, чтобы вы могли получить необходимую помощь без всей этой канители.
решение3
Кажется, вы говорите, что хотите заменить строку, которая появляется после =
,
неважно что это—
например,в данных образца вы хотите заменить [email protected]
. Но вы говорите, что независимо от того, какая строка после =
, вы хотите заменить ее на [email protected]
— по-видимому, вы хотите, чтобы это было жестко закодировано.
Есть несколько вариантов того, как это сделать. Самый простой —
sed 's/RESOURCE=.*/[email protected]/'
которая (как и все команды ниже) использует тот факт, что .*
означает «соответствовать всему, что есть». Если вы не хотите вводить RESOURCE=
дважды, вы можете сократить вышеприведенное до
sed 's/\(RESOURCE=\).*/\[email protected]/'
где \(
… \)
обозначает часть строки поиска как группу (можно иметь до девяти групп) и \1
означает замену на первую группу.
Вышеуказанные команды найдут и заменят RESOURCE=
везде, где он появляется в строке. Так, например, ввод
# Lakshminarayana wants to change all occurrences of "RESOURCE=".
[email protected]
[email protected]
[email protected]
FOX RESOURCE=The quick brown fox
# Comment: Originally line 2 said [email protected]
будет изменено на
# Lakshminarayana wants to change all occurrences of "[email protected]
[email protected]
[email protected]
[email protected]
FOX [email protected]
# Comment: Originally line 2 said [email protected]
Если вы хотите найти соответствие только тогда, когда RESOURCE=
оно находится в начале строки, используйте^
:
sed 's/^RESOURCE=.*/[email protected]/'
или
sed 's/^\(RESOURCE=\).*/\[email protected]/'
Если вы хотите заменить только значение ресурса, а не всю остальную часть строки — например,
[email protected] [email protected]
к
[email protected] [email protected]
это тоже можно сделать. Отредактируйте свой вопрос, чтобы сказать именно то, что вы хотите, с полными, понятными объяснениямииПримеры.
Хорошо, выберите один из вариантов выше.s
команды. Теперь, если вы хотите редактировать файл на месте (как вы указали), сделайте
sed -i { s command } { yourfile }
Если вы хотите создать новый файл, сделайте следующее:
sed { s command } { oldfile } > { newfile }
На самом деле не печатайте{
и}
; они там только для разграничения.