AFAICsed
和awk
都是通用文本处理实用程序,用户可以使用它们获得非常相似的结果,但语法略有不同:
通过两者,用户可以添加、替换/翻译和删除文件中的内容。
这两个通用文本处理实用程序和tr
文本处理实用程序之间的主要区别是什么?
我假设tr
的功能都包含在两者中sed
,awk
因此它只是缩小到特定的上下文替换一根弦插入另一根弦,但我不确定我在这里是否准确或翻译它给另一个。
答案1
是的,与和tr
相比,是一个“简单”的工具,并且和都可以轻松模仿awk
sed
awk
sed
最多它的基本行为,但两者都不是sed
或awk
没有“tr
内置”,因为它们中有一些单一的东西确切地做所有该做的事情tr
。
tr
适用于字符,而不是字符串,并将一组字符转换为另一组字符(如tr 'A-Z' 'a-z'
小写输入)。它的名字是“translate”或“transliterate”的缩写。
它确实有一些不错的功能,例如能够删除多个相同的连续字符,这可能用单个sed
表达式来实现有点繁琐。
例如,
tr -s '\n'
会将输入中的所有连续换行符压缩为单个换行符。
该tr
实用程序也不关心一行有多长,而sed
会在对其进行操作之前尝试读取内存中的完整行(同样,awk
会尝试在处理之前读取整个记录),这在某些退化情况下可能会成为问题所有数据都在几千兆字节长的“线路”上。
粗略地描述这三种工具:
tr
适用于角色(更改或删除它们)。sed
作用于行(修改单词或行的其他部分,或者插入或删除行)。awk
适用于带有字段的记录(默认情况下,一行上以空格分隔的字段,但这可以通过设置FS
和 来更改RS
)。
答案2
y/字符串1/字符串2/
替换所有出现的字符字符串1与相应的字符字符串2。
$ echo 'a big cat' | sed -e 'y/abc/def/'
d eig fdt
y
不支持字符范围a-z
或类别[:alpha:]
喜欢tr
,也不是补模-c
和-C
。-d
可以使用删除 ( ) s//
,就像用单个字符 ( -s
) 替换连续行一样。总的来说,sed
它基本上是面向线路的。y
有时在较长的脚本中间很有用sed
,但tr
如果这就是您所做的一切,可能会做得更好。
awk
没有与tr
的基本功能等效的功能,尽管您当然可以一次替换一个字符。 awk 语言非常通用,如果您有足够的动力,您可以编写足以实现您想要的任何转换的循环和条件。如果你更有动力的话,你也许sed
也能做到这一点。这些工具在任何意义上都不是真正等效的。
答案3
$ echo ooops not good | tr oops nice
iice nit giid
$ echo oops not good | sed 's/oops/nice/'
nice not good
tr 逐个字符翻译,而不是逐个单词翻译,因此它将更改所有此类字符,而不仅仅是具有此精确序列的字符。