sed 's/day/night/' < old > new 和 sed 's/day/night/' old > new 之间有什么区别

sed 's/day/night/' < old > new 和 sed 's/day/night/' old > new 之间有什么区别

Sed - Bruce Barnett 的介绍和教程有这个基本命令:s 表示替换

一个简单的例子是将“旧”文件中的“白天”更改为“新”文件中的“夜晚”:

sed s/day/night/ <old >new

或者另一种方法(对于 UNIX 初学者),

sed s/day/night/ old >new

有什么区别?为什么 Bruce Barnett 指定一种方法是“针对 UNIX 初学者”?

我可以看到old在两种情况下都将其用作输入,也可以看到new在两种情况下都将其用作输出。额外的部分<有什么区别吗?

答案1

实际上,它并没有太大的变化。事实上,第一个变体将您限制为一个文件,而第二个变体允许 sed 将多个输入连接到一个输出,以及使用其就地编辑选项。

技术上的区别在于前一种方法<依赖>关于 shell 重定向,这是 Unix 最初闻名的通用功能 - 由于其简单性并且完全通用且可在许多程序中重用:shell 打开文件并向您提供文件描述符。

(当时的其他系统要么完全缺乏重定向,要么需要多个命令才能激活它。)

后者也重定向输出,但不重定向输入。相反,它要求 sed本身打开输入文件 – 每个程序都必须自行实现,可能使用不一致的语法,您必须学习和重新学习;例如,一个工具可能需要--input=original.txt --output=processed.txt另一个工具-in original.txt。但另一方面,正如我提到的,这也更灵活,因为您不仅限于一个只读输入。


然而,就我个人而言,我认为将第二种语法归类为“...针对 Unix 新手”只是 1980 年代的精英主义或迂腐,就像教训人们使用cat foo | bar或嘲笑 Windows 和 VMS 用户没有“了解 Unix 哲学”一样。

答案2

听起来 Bruce 是一个“流主义者”,他相信“一切都是字节流”,以至于他们认为将文件作为参数传递是只有初学者才会做的事情。以下是我通常更喜欢第二种做事方式的一些原因:

  1. 它比较短。
  2. 从语法上来说,它更简单。
  3. 例如,它允许使用-i[suffix]就地替换,而不需要大量额外的操作来交换文件。
  4. 它与其他工具配合良好,例如xargs

相关内容