[ 21:55:26 ]$ cat sed_test.txt | sed 's/=\S*\s/yourtext /'
a yourtext 123
b yourtext 456
c yourtext 789
zxc
f yourtext 000
q yourtext test
[ 21:56:42 ]$
Тьфу, а я уже в другую сторону поехал... :) Так тебе надо от знака равенства до первого встреченного пробела текст заменить? Тот, который «native/14.04.2012-22.25», так что ли?
А там желательно пробелы и табуляции сохранять, как было до замены. (Или я ошибаюсь? не помню точно). Но на всякий случай - вариант с сохранением пробелов и табуляций:
'
`[^LIST]'
Matches any single character in LIST: for example, `[aeiou]'
matches all vowels. A list may include sequences like
`CHAR1-CHAR2', which matches any character between (inclusive)
CHAR1 and CHAR2.
A leading `^' reverses the meaning of LIST, so that it matches any
single character _not_ in LIST. To include `]' in the list, make
it the first character (after the `^' if needed), to include `-'
in the list, make it the first or last; to include `^' put it
after the first character.
The characters `$', `*', `.', `[', and `\' are normally not
special within LIST. For example, `[\*]' matches either `\' or
`*', because the `\' is not special here. However, strings like
`[.ch.]', `[=a=]', and `[:space:]' are special within LIST and
represent collating symbols, equivalence classes, and character
classes, respectively, and `[' is therefore special within LIST
when it is followed by `.', `=', or `:'. Also, when not in
`POSIXLY_CORRECT' mode, special escapes like `\n' and `\t' are
recognized within LIST. *Note Escapes::.
\s просто краткая запись. Не радует, что \d не работает (а в перловке работает).
//fixed. Вообще-то там может быть и не одно «=», а нам надо менять только subvol. Кроме того, хотя-бы один пробел должен быть. А с вашим скриптом его может и НЕ быть - \s* совпадает даже с пустой строкой, и с «дыркой» между символами, которой IRL нету.
вместо yourtext подставить текст, находящийся в переменной $PATH? в sed вообще можно подставлять переменные?
можно, пока это строчка bash'а... Только очень осторожно. В принципе что-то вроде $PATH можно подставить так:
's~subvol=\S*\(\s*\)~subvol='"$PATH"'\1~'
тут на самом деле три строчки: 'первая' «вторая» 'третья', они записаны слитно, потому bash воспринимает их как одну лексему. Причём $PATH раскрывается как переменная (двойные кавычки), а остальное не раскрывается.
Ну а в силу того, что в $PATH полно слешей, я в качестве разделителя заюзал ~, их вроде быть не должно.
Хотя вообще, что sed, что bash для написания безопасного ПО подходит слабо. Вот только альтернативы ещё не придумали... Ну не C же, и уж прости мну Патрег не php...
ну тут фишка в том, что нет никакой разницы, сколько пробельных символов захватит (\s*), хоть ноль, хоть Over9000. Скрипт всё равно будет правильно работать. ВСЕ непробельные символы будут захвачены (\S*) (из за жадности), и потому ставить туда ещё и (\s*) попросту не имеет смысла. Ну если нравится...
Вообще-то, надо еще перед подстановкой заэкранировать в переменной символы, которые sed может посчитать за специальные, а это зависит и от режима
базовые/расширенные regexp, и от того, куда именно в sed-скрипте подставлять -
поле адреса/поле поиска в s/поле замены в s..., и учитывать что в regexp
правила тоже разные в зависимости от позиции...
В общем, тот еще гемморой в общем случае, если не хочешь, чтобы sed
«внезапно» слетал по неверному синтаксису или, хуже того, порол чушь.
В именах файлов могут встречаться любые символы, кроме 0x0 и «/», так что
в общем случае в «${PATH}» может оказаться что угодно, включая «~» и \n.
я вот думаю - может, легче будет тупо удалять первую строку в fstab и вместо неё всовывать нужную? только я не пойму, как добавить первую строку в файл
а вам, господин теоретик, я предлагаю реализовать данную процедуру. Уверен, что после того, как вы её реализуете, со всех податчётных вам носителей исчезнут все такие кривые файлы, вы их будете жечь напалмом shred'ом, с ключом -n666. По себе знаю.
ABW
так что в общем случае в «${
...и в общем случае, _у вас_ таких файлов точно не будут. У меня-то их нет :-)