2010-06-04 5 views
1

Мне сложно выбрать из файла, используя регулярное выражение. Я пытаюсь заменить конкретный текст в файле, который заполнен такими строками.Регулярное выражение с sed

/Главная/пользователь/test2/данные/поезд /train38.wav /home/user/test2/data/train/train38.mfc

Я пытаюсь заменить жирный текст. Проблема в том, что я не знаю, как выбрать только полужирный текст, так как мне нужно использовать .wav в моем регулярном выражении, а имя файла и расположение файла также будут разными.

Надеется, что вы можете помочь

С наилучшими пожеланиями, Jökull

+5

Возможно, вы могли бы более точно определить строки, которые нужно заменить. Это строка между 5-м и 6-м/например? Или это всегда слово «поезд»? Или это слово заканчивается .wav, но в сегменте до того, где он заканчивается на .wav? –

ответ

1

Это предполагает, что вы хотите, чтобы заменить это строка между двумя последними косыми чертами в первом пути.

sed 's|\([^/]*/\)[^/]*\(/[^/]* .*\)|\1FOO\2|' filename 

производит:

/home/user/test2/data/FOO/train38.wav /home/user/test2/data/train/train38.mfc 
0
sed 's;\(\(/[^/]\+\)*\)/train\(\(/[^/]\+\)*\)\.wav;\1/FOO\3.wav;' 
+0

Это, похоже, не работает - он не изменяет ввод образца (по крайней мере, на MacOS X 10.6.7). –

+0

sed не изменяет ввод, «sed» означает «Stream EDitor», а потоки не доступны для записи. Первое, что вы сделаете, это «человек sed» и прочитайте, как работает ваша конкретная версия, у вас может быть или не быть способа изменить файл, и если вы не создадите временный и не замените оригинал Это. –

+0

извиняется за то, что вы незначительно неточно ... вы правы. Я должен был сказать: если ему предоставляется образец ввода, ваш сценарий sed не производит никаких изменений, поэтому вывод такой же, как и вход (по крайней мере, с MacOS X). Я могу изменить то, что вы написали, чтобы заставить его работать как расширенное регулярное выражение (ERE) следующим образом: 'sed -E '; ((/ [^ /] +) *)/train ((/ [^ /] +) *) \. wav; \ 1/FOO \ 3.wav; '', где основное изменение - уменьшение числа обратных косых черт.Поскольку вопрос составляет 10 месяцев, и первоначальный вопросник не уточнил этот вопрос, будет трудно точно знать, что нужно. –

1

SED процессы линии по одному за раз, так что вы можете опустить глобальный параметр, и он будет меняться только первый «поезд» на каждой линии

sed 's/train/FOO/' testdat 

vs

sed 's/train/FOO/g' testdat 

, которая является глобальной заменой

Это совсем немного более читаемыми и менее подвержены ошибкам, чем некоторые из других возможностей, но, конечно, есть приложения, которые не будут упрощать столь же легко.

0

Вы можете сделать это, как этот

sed -e 's/\<train\>/plane/g' 

The \< рассказывает СЭД, чтобы соответствовать началу этой работы и \> рассказывает, чтобы соответствовать конец слова.

g в конце означает глобальное, поэтому он выполняет совпадение и заменяет всю строку и не останавливается после первого успешного совпадения, как обычно, без g.

Смежные вопросы