Где находится ISO-образ сервера OpenSuSE для загрузить?

Проще, если вы сохранили эти строки в текстовом файле, например infile затем использовал ed для редактирования файлов на месте:

for f in ./*.txt; do
ed -s "$f" <<\IN
.t.
?[kK][eE][yY][wW][oO][rR][dD]?-1 r infile
$d
w
q
IN
done

Если вы просто хотели вставить какой-то текст (не содержимое файла), это похоже:

for f in ./*.txt; do
ed -s "$f" <<\IN
.t.
?[kK][eE][yY][wW][oO][rR][dD]?-1 s/$\
some_text\
more_text\
last\\_\&_line
$d
w
q
IN

Замените w на , p , чтобы увидеть, что он делает без изменения файлов.
Обратите внимание, что обратная косая черта, амперсанды и разделители должны быть экранированы в правой части подстановки. То же самое и с новой строкой, кроме последней.
Как это работает? Что ж, продублируйте последнюю строку, выполните поиск по ключевому слову в обратном направлении, вставьте текст или содержимое файла перед этой строкой, удалите повторяющуюся последнюю строку, напишите, выйдите.


Конечно, если вам не нужно редактировать эти файлы на месте и вы просто хотите распечатать измененные версии, как это делает Zanna , вам не нужны загадочные текстовые редакторы с синтаксисом из другой эпохи. ...Вы можете сделать это с помощью одного вызова sed - и потому что Wildcard любезно напомнил мне, что в этом семействе редакторов есть специальная команда для i вставить текст перед match, давайте воспользуемся этим и некоторым ветвлением:

sed -s '1{h;$!d;b end
}
/keyword/I{H;$!d
}
//{x;p;$!d
}
:end
${x;/keyword/Ii\
some_text_here\
more_text_here\
and_a\\_backslash
}' ./*.txt

Это работает только с gnu sed , хотя ... с другими sed вам придется запустить цикл (на этот раз без ветвление, чтобы между содержимым каждого файла была пустая строка):

for f in ./*.txt; do
sed -s '/[kK][eE][yY][wW][oO][rR][dD]/{H;$!d
}
//{x;p;$!d
}
${x;/[kK][eE][yY][wW][oO][rR][dD]/i\
some_text_here\
more_text_here\
and_a\\_backslash
}' "$f"
done

Как вы можете видеть, даже с i nsert, все равно нужно избегать обратных косых черт и новых строк (кроме последней). В остальном это просто: он просто накапливает строки в буфере удержания и обменивается ими при обнаружении совпадения; в последней строке он снова обменивается и вставляет текст перед совпадением, если таковое имеется.

1
13.11.2017, 00:52
0 ответов

Теги

Похожие вопросы