[Linux] sed的一些功能
Date: 2020.06.20
Author:Xin Pan
U p d a t e : 2020.07.10 \color{red}Update: 2020.07.10 Update:2020.07.10
文章目录
问题1. sed 删除含有特定字符的行
Linux 系统下。假设我们现在有wav.scp
这个文件,其内容是:
G0200_DTM1_050_ahead_000_G0200_S1001 /e/multiASR/egs/micArray/s5/G0200/session01/DTM1_050_ahead_000_G0200_S1001_00.wav
G0200_DTM1_050_ahead_000_G0200_S1004 /e/multiASR/egs/micArray/s5/G0200/session01/DTM1_050_ahead_000_G0200_S1004_00.det
G0200_DTM1_050_ahead_000_G0200_S1002 /e/multiASR/egs/micArray/s5/G0200/session01/DTM1_050_ahead_000_G0200_S1002_00.wav
G0200_DTM1_050_ahead_000_G0200_S1003 /e/multiASR/egs/micArray/s5/G0200/session01/DTM1_050_ahead_000_G0200_S1003_00.det
我们希望将其中包含有.det
的行全部去掉
解决
sed -e ‘/.det/d’ wav.scp >wav.scpnew
这句命令是删除wav.scp中的带有“.det”
的行,并且不改变输入文件,输出重定向到wav.scpnew
得到结果:
G0200_DTM1_050_ahead_000_G0200_S1001 /e/multiASR/egs/micArray/s5/G0200/session01/DTM1_050_ahead_000_G0200_S1001_00.wav
G0200_DTM1_050_ahead_000_G0200_S1004 /e/multiASR/egs/micArray/s5/G0200/session01/DTM1_050_ahead_000_G0200_S1004_00.det
G0200_DTM1_050_ahead_000_G0200_S1002 /e/multiASR/egs/micArray/s5/G0200/session01/DTM1_050_ahead_000_G0200_S1002_00.wav
问题2. sed去掉文件中的所有选中符号
现有文件,我希望将其中的所有符号去掉。
asdasdads....///
asdads1111()()
解决
sed -i 's/[,.、();,。();:“”:/《》?`"‘’[]? ]//g' input_filename
得到结果:
asdasdads
asdads
对于使用的命令
sed -i 's/[这里输入需要去掉的符号]//g' 输入文件名字
这个命令会把结果直接覆盖在输入文件中,而不需要输出重定向
问题3. sed提取有特定字符的行
对于文件我希望将其中包含特定字符的行取出来。
1 111_00 G1
2 222_00 G2
3 333_00a G3
解决
sed -n '/\_00 G/p' input_file
得到如下的结果:
panxin@panxin-msi:~/桌面$ sed -n '/\_00 G/p' text
1 111_00 G1
2 222_00 G2
这个命令会把结果输出在屏幕上,需要重定向。
sed -n '/需要提取的特定字符,有符号需要转义/p' 输入文件
问题4. sed提取特定字符结尾的行
对于文件我希望将其中以特定字符结尾的行取出来。
1 111_00.wav
2 222_00.wav
3 333_00.wav
4 444_01.ddd
解决
sed -n '/\_00.wav$/p' input_file
相比问题3的命令只是多了一个$符号,其他完全一致。
panxin@panxin-msi:~/桌面$ sed -n '/\_00.wav$/p' text
1 111_00.wav
2 222_00.wav
3 333_00.wav
问题5. sed删除两个符号之间的全部字符
sed -i 's/【.*】//g' input_file
解决
[panxin@localhost all]$ echo "G0499_DTM2_500_ahead_000_G0499_S5800 【aasd2222】九万八千五百六十六美元"|sed 's/ 【.*】/g'
G0499_DTM2_500_ahead_000_G0499_S5800九万八千五百六十六美元