Linux学习笔记(七)


tr和sed

sed

sed命令对文本的处理很强大,并且参数少,容易掌握,sed按顺序逐行读取文件。然后,它执行为该行指定的所有操作,并在完成请求的修改之后的内容显示出来,也可以存放到文件中。完成了一行上的所有操作之后,它读取文件的下一行,然后重复该过程直到它完成该文件。

sed 命令的基本格式如下:

sed [选项] '[脚本命令]' 文件名

选项含义
-e 脚本命令该选项会将其后跟的脚本命令添加到已有的命令中。
-f 脚本命令文件该选项会将其后文件中的脚本命令添加到已有的命令中。
-n取消默认控制台输出,仅显示处理后的结果

其中最常使用的使用sed来替换的脚本命令为:

sed -n '[address]s/pattern/replacement/flags'

其中,address 表示指定要操作的具体行,pattern 指的是需要替换的内容,replacement 指的是要替换的新内容。

address用于决定对哪些行进行编辑。地址的形式可以是数字、正则表达式、或二者的结合。如果没有指定地址,sed将处理输入文件的所有行。

address是一个数字,则表示行号;是“$”符号,则表示最后一行。address是逗号分隔的,那么需要处理的内容是这两行之间的范围(包括这两行在内)。

此命令中常用的 flags 标记

选项含义
n1~512 之间的数字,表示指定要替换的字符串出现第几次时才进行替换,例如,一行中有 3 个 A,但用户只想替换第二个 A,这是就用到这个标记;
g对数据中所有匹配到的内容进行替换,如果没有 g,则只会在第一次匹配成功时做替换操作。例如,一行数据中有 3 个 A,则只会替换第一个 A;
p会打印与替换命令中指定的模式匹配的行。此标记通常与 -n 选项一起使用。
d删除行

像这种比较抽象的命令应该多举几个例子:

删除

sed '1,3d' test.txt,删除第1~3行

删除hello.h文件中的空行,保存到hello2.h

sed -e 's/^[[:space:]]*$//g' hello.txt > hello2.txt

替换

sed 's/old/new/' testfile,把testfile文件中的old替换成new,只替换一次及终止在这一行的操作

sed 's/old/new/g' testfile,用new把文件testfile中的old全部替换掉

sed -n 's/old/new/p' testfile,只打印那些发生替换的行

cat test | sed -ne '2,8s/^zhang/ying/gp',在第二行,到第八行之间,替换以zhang开头的行,用ying来替换,并显示替换的行

在一个reference.bib文件中,将所有”…”替换为{…}

sed -e 's/"\([^"]*\)"/{\1}/g' reference.bib

使用下来你会发现其实和vi中的替换很类似,同样都是用 / 分割,当然也不一定,比如:

查找/usr/include/boost目录下的所有头文件,然后将之替换为/usr/local/include/boost路径,输出到header文件

find /usr/include/boost -name "*.h" | sed -e 's:/usr/include/\(.*\):/usr/local/include/\1:g' > header

其中使用的是: 为分隔符

tr

tr命令可以对来自标准输入的字符进行替换、压缩和删除。它可以将一组字符变成另一组字符,经常用来编写优美的单行命令,作用很强大。

用法:

tr [选项]... SET1 [SET2]

选项功能
-c取代所有不属于第一字符集的字符
-d删除所有属于第一字符集的字符
-s把连续重复的字符以单独一个字符表示
-t削减 SET1 指定范围,使之与 SET2 设定长度相等

仅在SET1 和SET2 都给出,同时没有-d 选项的时候才会进行替换。利用tr命令将一个dos结尾的\r\n文本文件变换为Unix结尾的\n

tr -d "\r" < a.txt > b.txt

tr -s "\r\n" "\n" < a.txt > b.txt

大写字母转小写

echo "TANK" |tr A-Z a-z #大写字母转小写

cat aaa.txt|tr 'a' 'c' #字母c替换字母a

cat aaa.txt|tr -d 'a' #删除所有字母a

cat aaa.txt|tr -s '\n' #删除空行


文章作者: JoyTsing
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 JoyTsing !
评论
 上一篇
Linux学习笔记(八) Linux学习笔记(八)
ShellUnix操作系统分为两个部分:内核和应用,内核是UNIX系统的核心并且驻留内存,日常事务比如直接与硬件通信等都由内核完成。除了内核,有一些基本模块也是驻留内存的,这些模块完成重要的功能,比如输入/输出管理,文件管理内存管理等待。
2020-05-08
下一篇 
Linux学习笔记(六) Linux学习笔记(六)
正则表达式什么是正则表达式 正则表达式是一组由字母和符号组成的特殊文本,它可以用来从文本中找出满足你想要的格式的句子。 Unix系统偏好于以可读的文本处理,例如vi、emacs、grep、sed、awk都支持正则表达式。 Posix标准中
2020-05-02
  目录