网站更换域名备案吗网站优化预算
目录
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  | 
