UNIX — страница 104 из 115

n
-ю строку, дав команду
np
или просто номер
n
, и строки с
m
по
n
, используя
m,np
. "Номером строки"
$
обозначается последняя строка, так что строки можно не считать.

1
Печатать первую строку;
то же самое
$
Печатать последнюю строку;
$p
то же самое
1,$p
Печатать строки с первой по последнюю

Печатать файл по одной строке проще всего; нажимая клавишу

RETURN
, вы можете вернуться на одну строку назад с помощью '
-
'. Можно комбинировать номера строк с '
+
' и '
-
'.

$-2,$p
Печатать последние три строки
1,2+3p
Печатать строки с первой по пятую

Однако нельзя печатать после конца файла или в обратном порядке; команды типа

$,$+1p
и
$,1p
считаются незаконными.

Команда

list 1
выводит текст в формате с видимыми символами. Это удобно при поиске в файлах управляющих символов, при различении пробелов, табуляции и т.п. (см.
vis
в гл. 7).

Образцы

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

ed
предлагает способ поиска строк, совпадающих с некоторым образцом, шаблоном:
/pattern/
обнаруживает очередное вхождение
pattern
.

$ ed poem 263

/flea/ 
Ищет очередную строку, содержащую flea

Great fleas have little fleas

/flea/ 
Ищет еще одну

And little fleas have lesser fleas,

//     
Ищет следующую по тому же образцу

And the great fleas themselves, in turn,

??     
Поиск в обратном направлении по тому же образцу

And little fleas have lesser fleas,

Редактор запоминает образец, применявшийся вами в последний раз, так что можно повторить поиск просто с помощью

//
. Для поиска в обратном направлении воспользуйтесь
?pattern?
и
??
.

Поиск с помощью

/.../
и
?...?
циклический, т.е. продолжается в обратном направлении после достижения одного из концов текста:

$p     
Печатать последнюю строку ('p' необязательна)

and greater still, and so on.

/flea/ 
Следующее flea вблизи начала

Great fleas have little fleas

??     
От начала идет в обратном направлении

 have greater fleas to go on;

Результатом поиска по образцу типа

/flea/
является номер строки, например 1 или
$
, который может использоваться в том же контексте, что и такие номера:

1,/flea/p
Печатать от единицы до следующего
flea
?flea?+1,$p
Печатать от предыдущего
flea + 1
до конца

Текущая редактируемая строка. Редактор

ed
отслеживает последнюю строку, с которой имели дело: печатали или вводили текст, читали из файла. Это текущая строка с именем '
.
'. Каждая команда определенным образом влияет на текущую строку, обычно настраивая ее на ту, с которой она последний раз работала. Вы можете использовать текущую строку так же, как
$
или номер строки типа 1:

$ ed poem

263

.      
Печатает текущую строку; после чтения файла

это то же, что $

 and greater still, and so on.

.-1,.p 
Печатает предыдущую строку и еще одну

While these again have greater still,

 and greater still, and so on.

Выражения для номера строки могут быть сокращены:

СокращениеЭквивалентСокращениеЭквивалент
-1
.-1
+
.+1
--
или
-2
.-2
++
или
+2
.+2
-n
.-n
+n
.+n
$-
$-1
.3
.+3
Добавление, замена, исключение, вставка

Команда

а
(добавить) добавляет строки после определенной строки, команда
d
(удалить) вычеркивает строки, команда
i
(вставить) вставляет строки перед определенной строкой, команда
с
(заменить) заменяет строки, действуя как комбинация команд "удалить" и "вставить".

na
Добавить текст после строки
n
ni
Вставить текст перед строкой
n
m,nd
Удалить строки с
m
по
n
m,nc
Заменить строки с
m
по
n

Если номера строк не указаны, используется текущая строка. Новый текст для команд

а
,
с
и
i
оканчивается строкой '
.
'; точка, введенная в последней строке, оставляется. Текущая строка настраивается на следующую строку после последней удаленной, за исключением случая, когда удалена последняя строка, т.е.
$
.

Добавить текст в начало (то же, что
1i
)
dp
Удалить текущую строку, печатать следующую (или последнюю, если
$
)
.,$dp
Удалить отсюда до конца, печатать новую последнюю
1,$d
Удалить все
?pat?,.-1d
Удалить от предыдущей, совпадающей с '
pat
' до той, что перед текущей
$dp
Удалить последнюю строку, печатать новую последнюю
$c
Заменить последнюю строку ($а добавляет после последней строки)
1,$c
Заменить все строки
Подстановка, аннулирование

Нет необходимости перепечатывать целую строку, если в ней нужно заменить лишь несколько символов. Команда подстановки

s
заменяет одну последовательность символов другой:

s/old/new/
Заменить первую
old
на
new
в текущей строке
s/old/new/p
Заменить первую
old
на
new
и печатать строку
s/old/new/g
Заменить каждую
old
на
new
в текущей строке
s/old/new/gp
Заменить каждую
old
на
new
и печатать строку

Заменяется только самое левое вхождение образца в строке, если не написана буква '

g
'. Команда
s
выводит измененную строку только в том случае, когда она ока