余苏明的幻想乡

Chapter 7. Sed Multi-Line Commands and loops

sed多行命令和循环,默认情况下sed命令是单行处理

46. Append Next Line to Pattern Space (N command)

添加下一行到P空间
1472615225743.png
回车替换成\n写入一行

在同一行输出行号

1
2
3
4
5
6
7
sed = employee.txt |sed '{N;s/\n/ /g}'
1 101,John Doe,CEO
2 102,Jason Smith,IT Manager
3 103,Raj Reddy,Sysadmin
4 104,anand Ram,Developer
5 105,Jane Miller,Sales Manager

n与N;2n与2N差异化研究

####
下面例子显示结果是在第2N遍执行sed-command里面的2N命令;在第N遍则不执行
推论:如为3N则第3N遍执行.

1
2
3
4
5
6
7
8
9
sed -n '{x;2N;s/\n/:/;p;G;s/\n/::/;p}' employee.txt
::101,John Doe,CEO
101,John Doe,CEO:103,Raj Reddy,Sysadmin
101,John Doe,CEO:103,Raj Reddy,Sysadmin ::102,Jason Smith,IT Manager
102,Jason Smith,IT Manager
102,Jason Smith,IT Manager ::104,anand Ram,Developer
104,anand Ram,Developer
104,anand Ram,Developer::105,Jane Miller,Sales Manager

n参数是输出最后一行

1
2
3
4
5
6
7
8
9
sed -n '{x;2n;s/\n/:/;p;G;s/\n/::/;p}' employee.txt
::101,John Doe,CEO
103,Raj Reddy,Sysadmin
103,Raj Reddy,Sysadmin ::102,Jason Smith,IT Manager
102,Jason Smith,IT Manager
102,Jason Smith,IT Manager ::104,anand Ram,Developer
104,anand Ram,Developer
104,anand Ram,Developer::105,Jane Miller,Sales Manager

步骤分析
1472696521206.png

47. Print 1st Line in MultiLine (P command)

输出多行的第一行。
P命令为输出模式空间,直到遇到一个\n符号,
所以如果模式空间里有多个\n换行符(比如有个N命令),则只输出第一行。

48. Delete 1st Line in MultiLine (D command)

删除多行的第一行

49. Loop and Branch (b command and :label)

循环和分支
b命令打上标签label,然后:label为锚点,跳到指定标签位:label处执行

50. Loop Using t command

循环使用t命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ vi label-t.sed
#!/bin/sed -nf
h;n;H;x
s/\n/:/
:repeat
/Manager/ s/^/*/
/\*\*\*/!t repeat
p
$ chmod u+x label-t.sed
$ ./label-t.sed empnametitle.txt
John Doe:CEO
***Jason Smith:IT Manager
Raj Reddy:Sysadmin
Anand Ram:Developer
***Jane Miller:Sales Manager

  • 下面一小段代码是循环的

    1
    2
    3
    :repeat
    /Manager/ s/^/*/
    /\*\*\*/!t repeat
  • :repeat :这个是标签

  • /Manager/ s/^/*/: 匹配Manager行,在行首加一个*号
  • /\*\*\*/!t repeat :判断如果上一句执行成功,并且不是***则跳到标签repeat继续执行