Ваше выражение: sed -n '/statistics:/,/^ [^ ]/ p'
Как и почему это работает?
sed
в естественном виде следует синтаксисуsed 's/substitution/replacement/[g]'
где s
для замены и необязательного g
в конце для глобальной замены (если текст замены найден более одного раза в строке.
Но sed
может сделать гораздо больше. У него есть возможность ограничить операцию определенными строками. Вы можете сделать это с помощью -
1. Specifying a line by its number.
2. Specifying a range of lines by number.
3. All lines containing a pattern.
4. All lines from the beginning of a file to a regular expression
5. All lines from a regular expression to the end of the file.
6. All lines between two regular expressions.
Что такое формат sed?
Ваш sed format
принимает последнюю форму . Он начинает выполнять свою магию со строки, содержащей statistics:
, до строки, которая содержит ровно два пробела от начала строки, т.е. __[^_]
, где _
это пробел, то есть
sed -n '/statistics:/,/^ [^ ]/ p'
| || | | | |
--- ----------- ------ V
| | | Since we suppressed
Suppress This is This is the output, we need
output your your to invoke print
start end
range range
Почему он выбирает раздел Channel statistics:
, а не Image statistics:
?
В исходных текстовых строках после Image Statistics:
с отступом ичем 2 пробела от начала строки, в результате они не отображаются. Если вы хотите включить Image Statistics:
Вы можете изменить свой Address End Range
, чтобы он был таким -
sed -n '/statistics:/,/^ Ren.*/p'
Why -n and p?:
sed
в его естественной форме печатает все.Каждая строка помещается в pattern space
, после чего все действия над ней выполняются, и затем строка печатается с новой строкой.Здесь действие p
означает, что будет напечатан весь текст, а строки, соответствующие диапазону sed's
, будут напечатаны дважды.Чтобы предотвратить это, мы вызываем -n
.Параметр -n
ничего не печатает, если не будет найден явный запрос к print
.