sed 保持空间命令之 x 的执行逻辑

目录

1. 将模式空间和保持空间的内容互换并打印

2. 将保持空间的内容交换回模式空间

3. 使用保持空间保存状态信息

4. 交换模式空间与保持空间隔行匹配


        sed 有两个内置的缓存空间:

  • 模式空间:该空间是 sed 内置的一个缓冲区,是 sed 执行的正常流程中,暂存当前处理行的空间。每处理完一行都会清空模式空间后再读取下一行。模式空间初始为空。
  • 保持空间:保持空间是另外一个缓冲区,用来存放临时数据,以便在后续处理中使用。与模式空间不同,保持空间的内容不会在循环中被删除。不能在保持空间上执行普通的 sed 命令。保持空间初始为一个换行符。

        sed 可以用 x(Exchange)命令交换模式空间和保持空间的内容。该命令通常和其它 sed 命令配合使用。以下用一些例子说明 x 命令的执行逻辑。

1. 将模式空间和保持空间的内容互换并打印

#echo -e "line1\nline2" | sed -n -e 'x;p'

line1
#

        在这个例子中,x 命令交换了模式空间和保持空间的内容;p 命令打印模式空间的内容。完整的执行流程如下表所示。

循环次数

模式空间

保持空间

操作

1

line1

\n

\n

line1

line1

x =>

p \n =>

2

line2

line1

line1

line2

x =>

p line1

2. 将保持空间的内容交换回模式空间

#echo -e "line1\nline2" | sed -n -e 'x;x;p'
line1
line2
#

        在这个例子中,连续使用了两次 x 命令,第一次将内容交换到保持空间,第二次又将保持空间的内容交换回模式空间。结果是每一行都没有改变,仍然为原来的内容。完整的执行流程如下表所示。

循环次数

模式空间

保持空间

操作

1

line1

\n

line1

\n

line1

\n

\n

x =>

x =>

p line1 =>

2

line2

\n

line2

\n

line2

\n

x =>

x =>

p line2

3. 使用保持空间保存状态信息

#echo -e "line1\nline2\nline3" | sed -n -e '/line2/!x;//!d;x;p'
line1
line3
#

        在这个例子中,对于不包含 line2 的行,交换到保持空间,否则保持模式空间不变;然后删除模式空间中的非空行;之后再次交换模式空间与保持空间的内容;最后打印模式空间的内容。结果是包含 line2 的行被删除,其它行没有任何变化。完整的执行流程如下表所示。

循环次数

模式空间

保持空间

操作

1

line1

\n

line1

\n

line1

line1

x =>

d =>

x =>

p line1 =>

2

line2

d =>

x =>

p =>

3

line3

line3

line3

x =>

x =>

p line3

4. 交换模式空间与保持空间隔行匹配

        示例文本 empnametitle.txt 的内容如下:

John Doe
CEO
Jason Smith
IT Manager
Raj Reddy
Sysadmin
Anand Ram
Developer
Jane Miller
Sales Manager

        每个记录对应姓名和职位两行,比如 John Doe 的职位是 CEO。下面的命令打印职位是 Manager 的员工姓名。

#sed -n -e '{x;n}' -e '/Manager/{x;p}' empnametitle.txt
Jason Smith
Jane Miller
#

        '{x;n}' 是将模式空间交换到保持空间,然后读取模式空间的下一行。这时达到的效果是将当前行保存到保持空间,将下一行读到模式空间内。即实现了奇数行和偶数行的分离,职位读取到模式空间,姓名读取到保持空间。
 
        '/Manager/{x;p}' 的作用是如果模式空间里含有关键字 Manager,则将保持空间交换回模式空间,并打印出模式空间的内容,即员工姓名。

        完整的执行流程如下表所示。

循环次数

模式空间

保持空间

操作

1

John Doe

\n

CEO

\n

John Doe

John Doe

John Doe

x =>

n =>

2

Jason Smith

John Doe

IT Manager

Jason Smith

John Doe

Jason Smith

Jason Smith

IT Manager

IT Manager

x =>

n =>

x =>

p Jason Smith =>

3

Raj Reddy

IT Manager

Sysadmin

IT Manager

Raj Reddy

Raj Reddy

Raj Reddy

x =>

n =>

4

Anand Ram

Raj Reddy

Developer

Raj Reddy

Anand Ram

Anand Ram

Anand Ram

x =>

n =>

5

Jane Miller

Anand Ram

Sales Manager

Jane Miller

Anand Ram

Jane Miller

Jane Miller

Sales Manager

x =>

n =>

x =>

p Jane Miller

        注意:上例中的命令顺序是先 x 后 n,如果调换两个命令的顺序,将产生不同的结果。

#sed -n -e '{n;x}' -e '/Manager/{x;p}' empnametitle.txt
Sysadmin
Developer
Sales Manager
#

        完整的执行流程如下表所示。

循环次数

模式空间

保持空间

操作

1

John Doe

CEO

\n

\n

\n

CEO

CEO

n =>

x =>

2

Jason Smith

IT Manager

CEO

CEO

CEO

IT Manager

IT Manager

n =>

x =>

3

Raj Reddy

Sysadmin

IT Manager

Sysadmin

IT Manager

IT Manager

Sysadmin

IT Manager

IT Manager

n =>

x =>

x =>

p Sysadmin =>

4

Anand Ram

Developer

IT Manager

Developer

IT Manager

IT Manager

Developer

IT Manager

IT Manager

n =>

x =>

x =>

p Developer =>

5

Jane Miller

Sales Manager

IT Manager

Sales Manager

IT Manager

IT Manager

Sales Manager

IT Manager

n =>

x =>

x =>

p Sales Manager

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值