Linux命令行与shell脚本编程大全笔记(sed进阶)

多行命令

三个可用来处理多行文本的特殊命令:
N: 将数据流中的下一行加进来创建一个多行组
D: 删除多行组中的一行
P: 打印多行组中的一行

模式空间:sed编辑器的工作空间

单行next命令 n
n 小写的n命令告诉sed编辑器移动到数据的下一行

# 删除首行之后的空行
$cat date1.txt
This is the header line.

this is a data line.

this is the last line.
$
$sed -n '/^$/d' date1.txt  # 该命令会删除date1.txt 中所有的空行
$sed -n '/header/{n; d}' date1.txt # 删除首行后的一行, n-移动到下一行,d-删除改行, {} 命令组合

多行next命令 N
N 大写的N会将下一行文本添加到模式空间中已有的文本后

$cat date3.txt
On Tuesday, the Linux System 
Administrator's group mettint will be held.
All System Administrators should attend, that's good.
$sed 'N; s/System.Administrators/Desktop users/' date3.txt # . 匹配空格或者换行符
# 若最后一行为单行,无法匹配下一行,则用下面的方法
$sed -e 's/System Administrators/Desktop users/; N; s/System\nAdministrators/Desktop users/' date3.txt 

多行删除命令
D 只删除模式空间的第一行,会删除到换行符(包含换行符)为止的所有字符

#删除目标字符串所在行的前一行
cat date5.txt

this is header
this is second
####
sed '/^$/{N; /header/D}' date5.txt

多行打印命令
P 只打印模式空间的第一行

# 只打印system 这一行,匹配的是这两行
sed -n 'N; /system\nAdministrator/P' data3.txt

保持空间
*模式空间:一块活跃的缓冲区,保持sed待检查的文本
*保持空间:另外一个缓冲区,可以临时保存一些行

sed 保持空间的一些命令

命令描述
h将模式空间赋值到保持空间
H将模式空间附加到保持空间
g将保持空间复制到模式空间
G将保持空间附加到模式空间
x交换模式空间和保持空间的内容
cat data2.txt
header
first
second
last
$sed -n '/first/{h; p; n; p; g; p}' data2.txt
#first
#second
#first

排除命令
感叹号! 用来排除命令
sed -n '/header/!p' data2.txt 打印除匹配到header的所有行

# 利用模式空间和保持空间反转一个文本
sed -n '1!G ; h ; $p' data2.txt
# 另外一个倒序显示命令
tac 倒序显示
cat 正序显示

改变流-分支
[address]b [label] adderss决定哪些行触发分支命令,label定义要跳转的位置,未加则跳转到脚本的结尾, label不超过七个字符

# 2.3两行不执行替换命令
sed '{2,3b ; s/This is/is this/; s/line./test?/}' data2.txt 
# 迭代删除文本中的第一个逗号, b之前如果不加模式匹配,则为死循环
echo "this, is, a, test, to, remove, commas." |
	sed -n '{:start; s/,//1p; /,/b start}'

改变流-测试
[address]t [label]测试命令会根据替换命令的结果跳转到某个标签

echo "this, is, a, test, to, remove, commas." |
	sed -n '{:start; s/,//1p; t start}'

模式代替

# 不能正确替换
echo "the cat has a hat" | sed 's/.at/".at"/g'
# & 可以用来代替替换命令中的匹配模式
echo "the cat has a hat" | sed 's/.at/"&"/g' # the "cat" has a "hat"

# 替代单独的单词,定义替换模式的子模式
# sed 编辑器用圆括号定义替换模式的子模式, 会给第一个子模式分配字符 \1 ,第二个 \2...
echo "the cat has a hat" | sed 's/\(cat\) has/\1 had/' # the cat had a hat
echo "1234567" | sed '{:start; s/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/; t start}'
# 1,234,567

创建sed实用工具

# 加倍行间距
sed 'G' data2.txt # sed启动时,保持空间只有一个空行
sed '$!G' data2.txt # 最后一行不加空行

# 对可能含有空白行的文件加倍行间距
sed '/^$/d; $!G' data2.txt

# 给文件中的行编号
sed '=' data2.txt | sed '{N; s/\n/ /}'

# 打印末尾行
sed '{:start; $q; N; 11,$D; b start}' data2.txt # 打印末尾10行的内容

#删除连续的空白行
sed '/./,/^$/!d' data2.txt

# 删除开头的空白行
sed '/./,$!d'

# 删除结尾的空白行
sed '{:start; /^\n*$/{$d; N; b start}}' data2.txt

#删除html标签
sed 's/<[^>]*>//g' data3.txt
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值