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 是一个“流主义者”,他相信“一切都是字节流”,以至于他们认为将文件作为参数传递是只有初学者才会做的事情。以下是我通常更喜欢第二种做事方式的一些原因:
- 它比较短。
- 从语法上来说,它更简单。
- 例如,它允许使用
-i[suffix]
就地替换,而不需要大量额外的操作来交换文件。 - 它与其他工具配合良好,例如
xargs
。