Seth Kenlon 发布的文章

Atom 是一个全面的环境,可以完成从基本到复杂的任务,适合从初学者到老用户。

 title=

现在漂亮的开源文本编辑器很常见,有 Adobe 的 Brackets、微软的 VSCode 和 GitHub 的 Atom。这些似乎都提供了类似的体验:现代化的界面、易于安装的插件,以及背后的一个大厂商支持。而且它们其实都很不错。那么 Atom 与其他超现代的文本编辑器有什么不同呢?与经典的老式编辑器如 VimEmacs 有何区别呢?

 title=

我用过很多文本编辑器,并且经过反思,我不得不承认,所有的文本编辑器基本上都差不多。在判断一个编辑器的功效时,只要它能做一件事:编辑文字,就能满足 80% 的要求。另外的 20% 则是额外的便利、额外的小玩意和花哨的功能。它们是很好的东西,但几乎不是必不可少的。

不过我经常回到 Atom,因为作为一个开源的用户,只要我愿意,我就可以奢侈地有很多应用使用。以下是我喜欢 Atom 的原因。

新手友好

我最喜欢 Atom 的一点是,它让人感觉很“正常”。我可以把 Atom 安装在任何人的电脑上,他们很快就可以开始输入了。没有新的键盘快捷键需要学习,没有严重偏离用户界面的惯例。如果我花几分钟时间向他们展示一些应用的强大功能,那么他们很快就会有能力安装新的插件,发现他们喜欢的有用功能。

它的独特之处在于让人感到与众不同,但又足够“安全”,足以让人相信(也确实如此)他们可以使用它。这是一条很难走的路线,但 Atom 做到了,我很欣赏它。

强大的扩展

当你启动应用就已经满足了大多数需求时,开源文本编辑器的一个主要“卖点”就是它的扩展。我习惯使用的编辑器是 GNU Emacs,它的扩展功能多到令人瞠目结舌,可以提供从电子邮件客户端到视频游戏的所有功能。要做到这一点很难,老实说,我还没有看到其它能做到的编辑器。不过这说明了扩展是多么重要,而 Atom 有一套不错的插件。

有一些扩展可以为语言和格式添加语法高亮、添加动态格式检查、以及集成调试器、运行时环境、视频和音乐播放器控件等等。实际上,你可以让 Atom 成为你桌面的控制中心,你很少需要离开它。

语言和语法支持

我是 Docbook 的忠实粉丝。顺便说一下,也是它的简化前端 Asciidoc 的粉丝。当我评估一个编辑器时,Docbook 模式和 Asciidoc 支持是我的两个主要指标。虽然对 XML 的支持比较常见,但与特定模式的集成可能是一个高难度的任务,而且 Asciidoc 相对小众。Atom 的社区为我最喜欢的格式提供了很好的支持。

当然,我已经提到了 Atom 一般来说有很好的扩展,但无论你在输入什么语言,语法高亮都是一个重要的功能。再次感谢充满活力的社区,在 Atom 的软件包仓库中,丰富的语法高亮选项的是它的优点之一。

简单定制主题

Atom 让你制作自己的风格就像设计网站的风格一样简单,所以如果你会使用 CSS,你可以制作你自己的 Atom 主题。要创建你自己的主题,找到 软件包 Package 菜单。如果你没有看到 软件包 Package 菜单,先按 Alt 键,露出顶部菜单栏。在 软件包 Package 菜单中,将鼠标悬停在 软件包生成器 Package Generator 上,然后选择 Generate Atom Syntax Theme 生成 Atom 语法主题 。这将打开一个新的项目,默认名为 “my-theme-syntax”。你可以把它命名为任何你想要的名字,但根据 Atom 惯例,它应该以 -syntax 结尾。

在你的新主题项目中,找到这些文件:base.lesscolors.lesssyntax-variables.less。这些文件定义了当语法激活时,特殊的关键字,甚至是背景和前景的颜色是如何显示的。因为它们都是从一个通用模板中继承的值,所以很容易修改。比如说:

// Syntax styles

.syntax--comment {
  color: @light-gray;
}

.syntax--keyword {
  color: @purple;

  &.syntax--control {
    color: @purple;
  }

  &.syntax--operator {
    color: @syntax-text-color;
  }

  &.syntax--other.syntax--special-method {
    color: @blue;
  }

  &.syntax--other.syntax--unit {
    color: @orange;
  }
}

以两个破折号结尾的值,如 .syntax--keyword,是语法高亮引擎识别的对象。当然,如果你想进一步开发你的自定义设置,你甚至可以创建你自己的语法定义(尽管这比 CSS 主题更费劲)。在 flight-manual.atom.io 上可以阅读所有关于修改 Atom 的方法。

灵活的工作流

Atom 有很多功能,默认情况下仅激活其中一部分。这意味着你可以决定你喜欢的工作方式,是否激活新的扩展并使用它们从根本上改变 Atom,还是只打开 Atom 的偏好并进行小的调整。你可以用 Atom 来写一本小说,也可以用它来写 Python 代码或技术文档或其他任何东西。

即使是它的 Git 集成也没有坚持让你使用可能会想到的显而易见的仓库(Github 赞助了 Atom)。它没有任何限制,而且它对每个人都同样有用,不管受众是谁。

安装

在 Linux、Windows 和 macOS 上,你可以 从它的网站安装 Atom

另外,在 Linux 上,你可以从 Flathub 中,以 Flatpak 安装 Atom。

如果你想自己构建 Atom,你也可以 从 Github 上的源码编译它

尝试 Atom

Atom 可以成为你的下一个文本编辑器、记事本和 IDE。它易于使用、易于配置、易于扩展,并提供了良好的用户体验。今天就下载 Atom,试试吧。


via: https://opensource.com/article/20/12/atom

作者:Seth Kenlon 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

这款全屏编辑器可以帮助你设定写作目标,并将干扰降到最低,从而实现你的目标。

计算机的好处是,它们真的很擅长一心多用。

计算机的坏处是,它们实在太擅长一心多用。

无论你认为自己作为一个人,在多任务处理方面是好是坏,有时你需要一点帮助来集中注意力,尤其是当你试图撰写清晰和简明的交流信息时。而这正是开发 Focuswriter 的原因。

安装

在 Linux 上,你可以从 Flathub 以 Flatpak 包安装 Focuswriter。

在 Windows 或 Linux 上(如果你不使用 Flatpak),你可以从它的网站安装 Focuswriter。你也可以从源代码安装,它也可以从 Focuswriter 网站上获得。

使用 Focuswriter

不可否认,Focuswriter 实际上处于文本编辑器和文字处理器的重叠的地带。它的默认格式是 开放文档文本 Open Document Text (.odt)格式,所以它允许你设置文本样式和对齐文本、标记页眉,以及开启和关闭智能引号。但它的文字处理器功能也就到此为止,因为 Focuswriter 确实主要专注于\_写作\_,而不是对你所写的东西进行样式设计。

Focuswriter 以几种不同的方式鼓励专注力:

吸引力

Focuswriter 看起来并不像你平常的电脑应用程序,更不像你平常的文本编辑器。当它启动时,它会在你的文档后面加载一个主题。主题一般是良性的 —— 默认是写字台,但也有星空、远方的风景等等。当然,你并不是要全神贯注于此主题,但它确实可以帮助你避免被徘徊于你的编辑器后面的其他应用窗口或电脑桌面分散注意力。因为它很容易定制,所以你几乎不大可能找不到你喜欢的主题。

 title=

音效

Focuswriter 使用起来其实很有趣。除了视觉主题外,它还有一个\_可选的\_打字机音频主题。启用后,每按一次键都会发出机械打字机按键的声音。当你按下回车键时,回车的声音令人满意,这是对你完成一段文字(或一行文字,如果你为了改善版本控制而每行写一句话)的奖励。

这个音频主题完全是可选的,默认情况下是不开启的。你可能会怀疑它的效果,但你不应该低估发出这些生产力声音而有具有现代文本编辑能力所带来的满足感。

全屏显示

Focuswriter 不仅在默认情况下启动全屏,而且还从视图中隐藏了其菜单和其他部件。要访问主菜单栏,你要将光标放在屏幕顶部,直到它出现。右边隐藏了一个滚动条,左边隐藏了一个文档切换器小部件,底部则隐藏着一个状态栏。

极简主义

Focuswriter 的编辑功能并不多。它没有高级搜索选项,也没有代码格式化或语法高亮的专门选项。它的设计是让你在文档中写入文本,而不是其他的什么。即使是上下文右键菜单也只提供基本的编辑功能(复制、剪切、粘贴等)或拼写检查选项。

聚焦一行

Focuswriter 的另一个可选功能是它能够“灰化”除了你的当前文本行之外的所有文本行。这可以帮助你的眼睛懒洋洋地定位你当前的文字行,如果你不是一个盲打打字员,或者如果你正在抄写一些你手写在纸张上的东西,眼睛必须经常远离屏幕,这可能特别有用。

目标追踪

你可以在 Focuswriter 的首选项中为自己设置一个每日字数目标或定时目标。当你工作时,你的进度会被跟踪,并显示在屏幕底部的状态栏中。除非你将光标悬停在它上面,否则它是隐藏在你的视野中的,所以你不会被迫沉迷于它,但它足够方便,可以帮助你保持进度。

即使你认为它很傻,也请尝试一下 Focuswriter

以前也听说过全屏文本编辑器,但我一直不觉得全屏文本编辑器对我来说有什么重要意义。毕竟,几乎所有的应用程序都可以全屏显示,而我个人也没有任何关注力问题。

不过在尝试过 Focuswriter 之后,我明白了一个好的全屏“关注力优先”文本编辑器的魅力所在。也许没有必要,但话又说回来,开源是如此的兴盛,我们有大量的冗余应用,这些应用功能略有差异,但实现上差异很大。Focuswriter 让写作变得有趣,它让工作变得愉快。下载它,设定一个目标,然后开始写作吧!


via: https://opensource.com/article/20/12/focuswriter

作者:Seth Kenlon 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

通过编写一个简单的游戏来认识 Lua,它是一种动态类型的、轻量级的、高效的、可嵌入的脚本语言。

 title=

如果你是 Bash、Python 或 Ruby 等脚本语言的爱好者,你可能会发现 Lua 很有趣。Lua 是一种动态类型的、轻量级的、高效的、可嵌入的脚本语言,它有与 C 语言的 API 接口。它通过基于寄存器的虚拟机解释字节码来运行,它可以用于过程式编程、函数式编程和数据驱动编程等编程方式。它甚至可以通过巧妙地使用数组(即“ table ”)来模拟类,以用于面向对象的编程。

感受一门语言的好方法是通过编写一个你已经熟悉的简单应用。最近,一些作者已经演示了如何使用他们最喜欢的语言来创建一个“猜数字”游戏。Lua 是我最喜欢的语言之一,所以这是我的 Lua 版猜数字游戏。

安装 Lua

如果你是在 Linux 上,你可以从你的发行版仓库中安装 Lua。在 macOS 上,你可以从 MacPortsHomebrew 安装 Lua。在 Windows 上,你可以从 Chocolatey 安装 Lua。

安装 Lua 后,打开你最喜欢的文本编辑器,可以准备编写了。

Lua 代码

首先,你必须设置一个伪随机数生成器,这样你的玩家就有一些不可预知的东西来尝试猜测。这是一个两个步骤的过程:首先,你根据当前的时间生成一个随机种子,然后在 1 到 100 的范围内选择一个数字:

math.randomseed(os.time())
number = math.random(1,100)

接下来,创建一个 Lua 所谓的 table 来表示你的玩家。表就像一个 Bash 中的数组或 Java 中的 ArrayList。你可以创建一个表,然后分配与该表相关的子变量。在这段代码中,player 是表,而 player.guess 是表中的一个条目:

player = {}
player.guess = 0

处于调试的需求,可以输出这个秘密数字。这对游戏并不合适,但对测试很有帮助。Lua 中的注释是在前面放双破折号:

print(number) --debug

接下来,设置一个 while 循环,当分配给 player.guess 的值不等于代码开始时建立的随机的 number 时,循环将永远运行。目前,player.guess 被设置为 0,所以它不等于 number。Lua 的不等式数学运算符是 ~=,诚然这很独特,但过一段时间你就会习惯。

在这个无限循环的过程中,首先游戏会打印一个提示,让玩家明白游戏的内容。

接下来,Lua 会暂停,等待玩家输入猜测的数。Lua 使用 io.read 函数从文件和标准输入 (stdin) 中读取数据。你可以将 io.read 的结果分配到一个变量中,这个变量是在 player 表中动态创建的。处理玩家输入的问题是,即使它是一个数字,它也是作为一个字符串读取的。你可以使用 tonumber() 函数将这个输入转换为整数类型,将结果赋值回初始为 0player.guess 变量:

while ( player.guess ~= number ) do
  print("Guess a number between 1 and 100")
  player.answer = io.read()
  player.guess = tonumber(player.answer)

现在 player.guess 包含了一个新的值,它将与 if 语句中的随机数进行比较。Lua 使用关键字 ifelseifelse,并用关键字 end 来结束该语句:

  if ( player.guess > number ) then
    print("Too high")
  elseif ( player.guess < number) then
    print("Too low")
  else
    print("That's right!")
    os.exit()
  end
end

最后,函数 os.exit() 在成功后关闭应用,关键字 end 使用了两次:一次是结束 if 语句,另一次是结束 while 循环。

运行应用

在终端上运行游戏:

$ lua ./guess.lua
96
Guess a number between 1 and 100
1
Too low
Guess a number between 1 and 100
99
Too high
Guess a number between 1 and 100
96
That's right!

就是这样!

直观且一致

从这段代码中可以看出,Lua 是非常一致且相当直观的。它的表机制是一种令人耳目一新的数据关联方式,它的语法也是简约而高效的。Lua 代码中几乎没有浪费的行,事实上,这个例子中至少有两行可以进一步优化,但我想把数据转换作为它的步骤来演示(也许你可以找到我所指的两行,并对它们进行重构)。

Lua 非常易于使用,它的文档阅读起来很愉快,主要是因为它的内容实在是不多。你会在短时间内学会核心语言,然后你就可以自由地探索 LuaRocks,发现别人贡献的各种很棒的库。“Lua” 在葡萄牙语中的意思是“月亮”,所以今晚可以尝试一下。


via: https://opensource.com/article/20/12/lua-guess-number-game

作者:Seth Kenlon 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Nextcloud 拥有流行的 Markdown 文件的最流畅的编辑器之一,它有很多方便和直观的功能。

纯文本的好处是,没有额外的针对计算机的信息会杂乱无章地出现在原本供人类阅读的文字中。计算机的好处是它们是可编程的,因此只要我们人类同意在写作时遵循非常特定的惯例,我们就可以对计算机进行编程,将人类可读的文本解释为秘密指令。例如,我们在一个词的周围打上两个星号,不仅可以给人类一个视觉上的提示,说明这个词很重要,我们还可给计算机编程让它用粗体显示这个词。

这正是 Markdown 背后的理论和实践,这种流行的纯文本格式向作者们承诺,只要\_他们\_使用特定的纯文本约定,那么他们的文本就会以特定的风格呈现。

传统中,这意味着作者用纯文本写作,直到文本被传给转换器应用(最初是 markdown.pl),才会看到漂亮的样式,但 Nextcloud 的 Markdown 编辑器应用改变了这一点。

通过 Nextcloud 的 Markdown 编辑器,你可以一边输入纯文本,一边看到它渲染后的样式。这对于那些要努力记住 Markdown 有时令人困惑的符号的作者们无异于是救星(方括号是在小括号中的超链接之前还是之后?)。而且更好的是,它运行在 Nextcloud 中,所以你可以在任何地方使用它。

安装

要使用 Nextcloud 的 Markdown 编辑器,你必须安装 Nextcloud。好消息是,Nextcloud 非常\_容易\_安装。我已经在树莓派、共享服务器、甚至作为一个本地应用安装了它(这是愚蠢的,不要这样做)。如果你不相信自己的能力,你甚至可以依靠 Turnkey Linux 来帮你完成这些难关,否则就直接从 Nextcloud.com 购买托管服务。在你安装 Nextcloud 后,添加应用就很简单了。点击 Nextcloud 界面右上角的用户图标,选择 Apps。找到 Office and Text 类别,点击安装并启用 Markdown Editor

 title=

启动

激活后,Markdown 编辑器会与 Nextcloud 文件中任何以 .md 结尾的文件相关联,当你打开一个 Markdown 文件时,你就会启动 Markdown 编辑器。

使用 Markdown 编辑器

Markdown 编辑器包含了一个大的文本区域供你输入,以及一个沿着顶部的工具栏。

 title=

工具栏包含了文字处理器的基本功能:用粗体、斜体和删除线设计文本样式、创建标题和段落、列表等等。

如果你了解 Markdown,这些功能中的许多可以在你输入时自动调用。如果你不熟悉 Markdown,那么工具栏或常用的键盘快捷键(Ctrl+B 表示粗体,Ctrl+I 表示斜体等等)可以帮助你设计文本的样式。

Markdown 编辑器的工作方式的最好的一点是,它真正做到了使人人满意:如果你想以 Markdown 格式输入,那么它就会接受它并立即将其转化为视觉样式;如果你不想操心 Markdown 语法,那么当你使用键盘快捷键或工具栏按钮时,它就会为你生成样式。无论哪种方式,你永远不会看到 Markdown 语法格式,但你也永远不会失去它。这是一个完美的折中方案。

它也是一个非常聪明的编辑器。当你选择一个单词时,它会为你创建一个超链接,它能快速流畅地自动转换 Markdown,而且它知道一些不同“风格”的 Markdown 语法(主要是 Commonmark,但也有传统的 Markdown、Github Markdown,等等)。

 title=

尝试 Nextcloud

我用过几个 Markdown 预览应用,Nextcloud 的 Markdown 编辑器是最流畅的一个。它尊重用户,并为显示 Markdown 做了最基本的工作,所以它的转换速度很快,也很准确。因为它是 Nextcloud 中的一个应用,你还可以获得这样的好处:你的作品可以即时保存在自己的私有的开源云上,并进行版本控制。没有比这更好的文本编辑器了。


via: https://opensource.com/article/20/12/nextcloud-markdown

作者:Seth Kenlon 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Joe's Own Editor (JOE)是一款简单易学和使用的通用文本编辑器。

我很喜欢那些能让你轻松学会如何使用的文本编辑器。GNU nano 是我最喜欢的例子:你启动 nano,你会在整个会话的窗口底部看到一个最常用的命令列表。Joe's Own Editor(简称 joe)是另一个很好的例子。

joe 编辑器使用了一个基于终端的界面,提供了简单的文本编辑功能和一个易于访问的帮助屏幕。它用 C 语言编写,体积小,只对 libc 有硬性依赖(ncurses 是可选的),并且采用 GPL 许可证。

安装

在 Linux 上,你也许能在你的发行版软件仓库中找到 JOE。虽然它有点小众,并不是所有的发行版都打包了它。如果是这样的话,你可以从 SourceForge 下载源码,然后自己编译。这是个简单的过程:

$ ./configure
$ make
$ sudo make install

使用 JOE

据其作者介绍,JOE 的灵感来自于一个叫 WordStar 的应用和 GNU Emacs。它的大部分基本编辑键都与 WordStar 的快捷键相同,编辑器本身也在努力向 WordStar 靠拢。JOE 也有 GNU Emacs 的一些键绑定和功能。这种两种灵感来源的混合有时会让人迷惑,但话又说回来,在任何情况下,让自己离开 Emacs(或你通常选择的文本编辑器)都会让人迷惑。重要的是,JOE 提供了帮助,而且很容易访问。

在 JOE 界面右上角,有一个持续的提示,你可以按 Ctrl+K,紧接着按 H 来查看帮助界面。这是一个切换键,所以一旦你激活它,帮助屏幕就会一直显示在你的编辑器窗口顶部,直到用同样的组合键(JOE 中的键盘符号为 ^KH)解除。

键盘快捷键

尽管 JOE 的作者在模拟 WordStar 用户体验方面非常自豪,但我不得不承认,这对我来说是失落的。我从来没有听说过 WordStar,直到我在 JOE 的文档中读到了它,在我看来,它的键盘快捷键方案完全是任意的。有的用 Ctrl+K 作为转义序列的前缀,有的用 Esc 作为前缀,还有的完全不需要转义序列。我无法确定其中的逻辑。编辑操作和应用选项一样,都有可能需要或不需要转义序列,而且字母关联对我来说是没有什么意义(例如,Ctrl+K D 代表另存为)。

幸运的是,JOE 可以让你在键盘快捷键上作弊。安装后,JOE 会悄悄为 joe 可执行文件创建一些符号链接。包括:

  • jmacs JOE 使用 Emacs 键绑定
  • jpico JOE 使用 Pico (或 GNU nano) 键绑定
  • rjoe JOE 的编辑只限于启动时传递给 JOE 的文件
  • jstar JOE 使用 WordStar 键绑定

 title=

持久保留的帮助菜单仍然存在,所以如果你不清楚有哪些功能可以使用,可以通过屏幕右上方的帮助提示来参考。当然,在 Pico/nano 模式下,主要命令总是可见的。

尝试 JOE

JOE 并不是一个你永远不会离开的文本编辑器,它不会成为你的 IDE、电子邮件客户端、网络浏览器和文件管理器。事实上,它甚至可能不是你所有任务的主要文本编辑器。它专注于做好一件事,那就是成为一般的文本编辑。

JOE 拥有你所需要的所有基本功能,比如能够快速浏览你的文本、能够选择文本、复制和粘贴等等。试试 JOE 吧,使用你喜欢的符号链接。


via: https://opensource.com/article/20/12/joe

作者:Seth Kenlon 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Sed 缺少通常的文本框,而是按照用户的命令直接写入到文件上。

sed 命令是为 AT&T 最初的 Unix 操作系统第 7 版创建的,此后,可能每一个 Unix 和 Linux 操作系统都包含了它。sed 应用程序是一个 流编辑器,与文本编辑器不同的是,它不会打开一个视觉缓冲区,将文件的数据加载到其中进行处理。相反,它根据在终端输入的命令或脚本中的一系列命令,逐行对文件进行操作。

安装

如果你使用的是 Linux、BSD 或 macOS,那么你已经安装了 GNU 或 BSD 版的 sed。这是两个不同的原始 sed 命令的重新实现,虽然它们很相似,但也有一些小的区别。GNU sed 通常被认为是功能最丰富的 sed,而且它在这些平台上都可以广泛使用。

如果你找不到 GNU sed(在非 Linux 系统上通常被称为 gsed),那么你可以从 GNU 网站上下载它的源代码。安装 GNU sed 的好处是,可以使用它的额外功能,但它也可以被限制为只符合 sedPOSIX 规范,如果你需要移植性的话。

在 Windows 上,你可以用 Chocolatey安装 GNU sed

Sed 如何工作

sed 应用程序一次只处理一行。因为它没有视觉显示,所以它在内存中创建了一个模式空间:一个包含输入流的当前行的空间(去掉任何尾部的换行符)。一旦填充了模式空间,你对 sed 的指令就会被执行。有时你的指令是有条件的,有时是无条件的,所以这些指令的结果取决于你如何使用 sed

当命令结束时,sed 会将模式空间的内容打印到输出流中。默认的输出流是标准输出,但可以将其重定向到一个文件,甚至使用 --in-place=.bak 选项重定向到同一个文件中。

然后再从下一个输入行开始循环。

sed命令的语法是:

$ sed --options [optional SCRIPT] [INPUT FILE or STREAM]

找到你要编辑的内容

在可视化编辑器中,你通常不需要考虑太多,就能在文本文件中找到你想要修改的内容。你的眼睛(或屏幕阅读器)会扫描文本,找到你想改变的单词或你想插入或删除文本的地方,然后你就可以开始输入了。而 sed 没有交互模式,所以你需要告诉它必须满足什么条件才能运行特定的命令。

在这些例子中,假设一个名为 example.txt 的文件包含了这样的文字:

hello
world
This is line three.
Here is the final line.

行号

指定行号告诉 sed 只对文件中的那一行进行操作。

例如,下面这条命令选择文件的第 1 行并打印出来。因为 sed 在处理后的默认操作也是打印一行到标准输出,这样做的效果就是重复第一行:

$ sed '1p' example.txt
hello
hello
world
This is line three.
Here is the final line.

你也可以步进式指定行号。例如,1~2 表示每两行选择一行(“从第一行开始每两行选择一行”)。指令 1~3 表示从第一行开始,每三行选择一行:

$ sed '1p' example.txt
hello
hello
world
This is line three.
Here is the final line.
Here is the final line.

行定位

你可以通过使用 $ 作为选择器,只对文件的最后一行进行操作:

$ sed '$p' example.txt
hello
world
This is line three.
Here is the final line.
Here is the final line.

在 GNU sed 中,你可以选择多行(例如,sed '1,$p' 打印第一行和最后一行)。

反转

任何数字或位置的选择,你都可以用感叹号(!)字符反转。下面这将选择除第一行以外的所有行:

$ sed '1!p' example.txt
hello
world
world
This is line three.
This is line three.
Here is the final line.
Here is the final line.

模式匹配

你可以把模式匹配想象成文字处理器或浏览器中的查找操作。你提供一个词(一个 模式),然后选择了结果。模式匹配的语法是 /pattern/

$ sed '/hello/p' example.txt
hello
hello
world
This is line three.
Here is the final line.
$ sed '/line/p' example.txt
hello
world
This is line three.
This is line three.
Here is the final line.
Here is the final line.

用 Sed 编辑

一旦你找到了你要编辑的内容,你就可以执行你想要的任何操作。你可以用 sed 中的命令来执行编辑。sed 中的命令不是 sed 命令本身。如果这样说有帮助的话,可以把它们看作是“动作”或“动词”或“指令”。

sed 中的命令是单个字母,例如前面例子中使用的打印命令的 p。它们一开始可能很难记忆,但和所有事情一样,你会随着练习而了解它们。

p 代表打印

p 指令打印当前模式空间中的任何内容。

d 用于删除

d 指令删除模式空间:

$ sed '$d' example.txt
hello
world
This is line three.
$ sed '1d' example.txt
world
This is line three.
Here is the final line.

s 用于搜索和替换

s 命令搜索一个模式并将其替换为其他东西。这可能是 sed 最流行和最随意的用法,而且它通常是用户学习的第一个(有时也是唯一的)sed 命令。几乎可以肯定它是文本编辑中最有用的命令:

$ sed 's/world/opensource.com/' example.txt
hello
opensource.com
This is line three.
Here is the final line.

在你的替换文本中,也可以使用一些特殊的功能。例如,\L 将替换文本转换为小写,\l 则只转换下一个字符。还有其他一些功能,列在 sed 文档中(你可以用 info sed 命令查看)。

替换子句中的特殊字符 & 指的是匹配到的模式:

$ sed 's/is/\U&/' example.txt
hello
world
ThIS is line three.
Here IS the final line.

你也可以通过特殊的标志来影响 s 如何处理它找到的内容。g(应该是指 全局)标志告诉 s 对行上找到的所有匹配项进行替换,而不仅仅是第一个匹配项:

$ sed 's/is/\U&/g' example.txt
hello
world
ThIS IS line three.
Here IS the final line.

其他重要的标志还包括用一个数字来表示要影响第几个出现的匹配模式:

$ sed 's/is/\U&/2' example.txt
hello
world
This IS line three.
Here is the final line.

w 标志,后面跟着一个文件名,\_只有\_在有变化的情况下,才会将匹配的行写入文件:

$ sed 's/is/\U&/w sed.log' example.txt
hello
world
ThIS is line three.
Here IS the final line.
$ cat sed.log
ThIS is line three.
Here IS the final line.

标志可以组合:

$ sed 's/is/\U&/2w sed.log' example.txt
hello
world
This IS line three.
Here is the final line.
$ cat sed.log
This IS line three.

脚本

有很多很棒的网站都有 sed “单行脚本”,它们给你提供了面向任务的 sed 命令来解决常见的问题。然而,自己学习 sed 可以让你写出自己的单行脚本,而且这些单行脚本可以根据你的具体需求来定制。

sed 的脚本可以在终端中写成一行,也可以保存到文件中,然后用 sed 本身执行。我倾向于把小脚本写成一个命令,因为我发现自己在现实生活中很少重复使用 sed 命令。当我写一个 sed 脚本时,通常都是针对一个文件的。例如,在写完这篇文章的初稿后,我用 sed 来规范 “sed” 的大小写,而这是我可能永远也不会再做的任务。

你可以向 sed 发出一系列不同的命令,用分号(;)分开。

$ sed '3t ; s/line/\U&/' example.txt
hello
world
This is LINE three.
This is the final line.

带括号的范围改变

你也可以用大括号({})限制哪些结果受到影响。当你将 sed 命令用大括号括起来时,它们只适用于特定的选择。例如,“line” 字出现在样本文本的两行中。你可以通过声明所需的匹配条件($ 表示最后一行),并将你希望执行的 s 命令放在紧随其后的括号中,强制 sed 只影响最后一行:

$ sed '$ {s/line/\U&/}' example.txt
hello
world
This is line three.
This is the final LINE.

学习 Sed

你可以用 sed 做的事情比本文所解释的多得多。我甚至还没有涉及到分支(b)、测试(t)、保留空格(H)和许多其他功能。就像 ed 一样,sed 可能不是你要用来创建文档的文本编辑器,甚至不是你需要做的每一个脚本任务中使用的文本编辑器,但它是你作为 POSIX 用户的一个强大的选择。学习 sed 命令的结构以及如何编写简短的脚本可以快速修改大量的文本。阅读 GNU sedinfo 页面,或者 BSD sed 的手册页,看看 sed 能为你做什么。


via: https://opensource.com/article/20/12/sed

作者:Seth Kenlon 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出