tr(翻译)到 sed 和 awk 之间的主要区别

tr(翻译)到 sed 和 awk 之间的主要区别

AFAICsedawk都是通用文本处理实用程序,用户可以使用它们获得非常相似的结果,但语法略有不同:

通过两者,用户可以添加、替换/翻译和删除文件中的内容。

这两个通用文本处理实用程序和tr文本处理实用程序之间的主要区别是什么?

我假设tr的功能都包含在两者中sedawk因此它只是缩小到特定的上下文替换一根弦插入另一根弦,但我不确定我在这里是否准确或翻译它给另一个。

答案1

是的,与和tr相比,是一个“简单”的工具,并且和都可以轻松模仿awksedawksed最多它的基本行为,但两者都不是sedawk没有“tr内置”,因为它们中有一些单一的东西确切地做所有该做的事情tr

tr适用于字符,而不是字符串,并将一组字符转换为另一组字符(如tr 'A-Z' 'a-z'小写输入)。它的名字是“translate”或“transliterate”的缩写。

它确实有一些不错的功能,例如能够删除多个相同的连续字符,这可能用单个sed表达式来实现有点繁琐。

例如,

tr -s '\n'

会将输入中的所有连续换行符压缩为单个换行符。

tr实用程序也不关心一行有多长,而sed会在对其进行操作之前尝试读取内存中的完整行(同样,awk会尝试在处理之前读取整个记录),这在某些退化情况下可能会成为问题所有数据都在几千兆字节长的“线路”上。

粗略地描述这三种工具:

  • tr适用于角色(更改或删除它们)。
  • sed作用于行(修改单词或行的其他部分,或者插入或删除行)。
  • awk适用于带有字段的记录(默认情况下,一行上以空格分隔的字段,但这可以通过设置FS和 来更改RS)。

答案2

sed有一个y命令这类似于tr:

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 逐个字符翻译,而不是逐个单词翻译,因此它将更改所有此类字符,而不仅仅是具有此精确序列的字符。

相关内容