了解 sed 的基本用法，然后下载我们的备忘单，方便快速地参考 Linux 流编辑器。很少有 Unix 命令像 sed、grep 和 awk 一样出名，它们经常组合在一起，可能是因为它们具有奇怪的名称和强大的文本解析能力。它们还在一些语法和逻辑上有相似之处。虽然它们都能用于文本解析，但都有其特殊性。本文研究 sed 命令，它是一个 流编辑器 stream editor 。我之前写过关于 sed 以及它的远亲 ed 的文章。要熟悉 sed，对 ed 有一点了解是有帮助的，因为这有助于你熟悉缓冲区的概念。本文假定你熟悉 sed 的基本知识，这意味着你至少已经运行过经典的 s/foo/bar 风格的查找和替换命令。下载我们的免费 sed 备忘录安装 sed如果你使用的是 Linux、BSD 或 macOS，那么它们已经安装了 GNU 的或 BSD 的 sed。这些是原始 sed 命令的独特重新实现。虽然它们很相似，但也有一些细微的差别。本文已经在 Linux 和 NetBSD 版本上进行了测试，所以你可以使用你的计算机上找到的任何 sed，但是对于 BSD sed，你必须使用短选项（例如 -n 而不是 --quiet）。GNU sed 通常被认为是功能最丰富的 sed，因此无论你是否运行 Linux，你可能都想要尝试一下。如果在 Ports 树中找不到 GNU sed（在非 Linux 系统上通常称为 gsed），你可以从 GNU 网站 下载源代码。 安装 GNU sed 的好处是，你可以使用它的额外功能，但是如果需要可移植性，还可以限制它以遵守 sed 的 POSIX 规范。MacOS 用户可以在 MacPorts 或 Homebrew 上找到 GNU sed。在 Windows 上，你可以通过 Chocolatey 来 安装 GNU sed。了解模式空间和保留空间sed 一次只能处理一行。因为它没有可视化模式，所以会创建一个 模式空间 pattern space ，这是一个内存空间，其中包含来自输入流的当前行（删除了尾部的任何换行符）。填充模式空间后，sed 将执行你的指令。当命令执行完时，sed 将模式空间中的内容打印到输出流，默认是 标准输出，但是可以将输出重定向到文件，甚至使用 --in-place=.bak 选项重定向到同一文件。然后，循环从下一个输入行再次开始。为了在遍历文件时提供一点灵活性，sed 还提供了 保留空间 hold space （有时也称为 保留缓冲区 hold buffer ），即 sed 内存中为临时数据存储保留的空间。你可以将保留空间当作剪贴板，实际上，这正是本文所演示的内容：如何使用 sed 复制/剪切和粘贴。首先，创建一个示例文本文件，其内容如下：Line one Line three Line two 复制数据到保留空间要将内容放置在 sed 的保留空间，使用 h 或 H 命令。小写的 h 告诉 sed 覆盖保留空间中的当前内容，而大写的 H 告诉 sed 将数据追加到保留空间中已经存在的内容之后。单独使用，什么都看不到：$ sed --quiet -e '/three/ h' example.txt $ --quiet（缩写为 -n）选项禁止显示所有输出，但 sed 执行了我的搜索需求。在这种情况下，sed 选择包含字符串 three 的任何行，并将其复制到保留空间。我没有告诉 sed 打印任何东西，所以没有输出。从保留空间复制数据要了解保留空间，你可以从保留空间复制内容，然后使用 g 命令将其放入模式空间，观察会发生什么：$ sed -n -e '/three/h' -e 'g;p' example.txt Line three Line three 第一个空白行是因为当 sed 第一次复制内容到模式空间时，保留空间为空。接下来的两行包含 Line three 是因为这是从第二行开始的保留空间。该命令使用两个唯一的脚本（-e）纯粹是为了帮助提高可读性和组织性。将步骤划分为单独的脚本可能会很有用，但是从技术上讲，以下命令与一个脚本语句一样有效：$ sed -n -e '/three/h ; g ; p' example.txt Line three Line three 将数据追加到模式空间G 命令会将一个换行符和保留空间的内容添加到模式空间。$ sed -n -e '/three/h' -e 'G;p' example.txt Line one Line three Line three Line two Line three 此输出的前两行同时包含模式空间（Line one）的内容和空的保留空间。接下来的两行与搜索文本（three）匹配，因此它既包含模式空间又包含保留空间。第三行的保留空间没有变化，因此在模式空间（Line two）的末尾是保留空间（仍然是 Line three）。用 sed 剪切和粘贴现在你知道了如何将字符串从模式空间转到保留空间并再次返回，你可以设计一个 sed 脚本来复制、删除，然后在文档中粘贴一行。例如，将示例文件的 Line three 挪至第三行，sed 可以解决这个问题：$ sed -n -e '/three/ h' -e '/three/ d' \ -e '/two/ G;p' example.txt Line one Line two Line three 第一个脚本找到包含字符串 three 的行，并将其从模式空间复制到保留空间，替换当前保留空间中的任何内容。第二个脚本删除包含字符串 three 的任何行。这样就完成了与文字处理器或文本编辑器中的 剪切 动作等效的功能。最后一个脚本找到包含字符串 two 的行，并将保留空间的内容\_追加\_到模式空间，然后打印模式空间。任务完成。使用 sed 编写脚本再说一次，使用单独的脚本语句纯粹是为了视觉和心理上的简单。剪切和粘贴命令作为一个脚本同样有效：$ sed -n -e '/three/ h ; /three/ d ; /two/ G ; p' example.txt Line one Line two Line three 它甚至可以写在一个专门的脚本文件中：#!/usr/bin/sed -nf /three/h /three/d /two/ G p 要运行该脚本，将其加入可执行权限，然后用示例文件尝试：$ chmod +x myscript.sed $ ./myscript.sed example.txt Line one Line two Line three 当然，你需要解析的文本越可预测，则使用 sed 解决问题越容易。发明 sed 操作（例如复制和粘贴）的“配方”通常是不切实际的，因为触发操作的条件可能因文件而异。但是，你对 sed 命令的使用越熟练，就越容易根据需要解析的输入来设计复杂的动作。重要的事情是识别不同的操作，了解 sed 何时移至下一行，并预测模式和保留空间包含的内容。下载备忘单sed 很复杂。虽然它只有十几个命令，但它灵活的语法和原生功能意味着它充满了无限的潜力。为了充分利用 sed，我曾经参考过一些巧妙的单行命令，但是直到我开始发明（有时是重新发明）自己的解决方案时，我才觉得自己真正开始学习 sed 了 。如果你正在寻找命令提示和语法方面的有用技巧，下载我们的 sed 备忘单，然后开始一劳永逸地学习 sed！via: https://opensource.com/article/21/3/sed-cheat-sheet作者：Seth Kenlon 选题：lujun9972 译者：MjSeven 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
了解如何在 Linux 中使用 xclip。在使用 Linux 桌面工作时，你通常如何复制全部或部分文本？你可能会在文本编辑器中打开文件，选择全部或仅选择要复制的文本，然后将其粘贴到其他位置。这样没问题。但是你可以使用 xclip 在命令行中更有效地完成工作。xclip 提供了在终端窗口中运行的命令与 Linux 图形桌面环境中的剪贴板之间的管道。安装 xclipxclip 并不是许多 Linux 发行版的标准套件。要查看它是否已安装在你的计算机上，请打开终端窗口并输入 which xclip。如果该命令返回像 /usr/bin/xclip 这样的输出，那么你可以开始使用了。否则，你需要安装 xclip。为此，请使用你的发行版的包管理器。如果你喜欢冒险，你可以从 GitHub 获取源代码并自己编译。基础使用假设你要将文件的内容复制到剪贴板。在 xclip 中可以使用两种方法。输入：xclip file_name或者xclip -sel clip file_name两个命令之间有什么区别（除了第二个命令更长）？第一个命令在你使用鼠标中键粘贴的情况下有效。但是，不是每个人都这样做。许多人习惯使用右键单击菜单或按 Ctrl+V 粘贴文本。如果你时其中之一（我就是！），使用 -sel clip 选项可确保你可以粘贴要粘贴的内容。将 xclip 与其他应用一起使用将文件内容直接复制到剪贴板是个巧妙的技巧。很可能你不会经常这样做。还有其他方法可以使用 xclip，其中包括将其与另一个命令行程序结合。结合是用管道（|）完成的。管道将一个命令行程序的输出重定向到另一个命令行程序。这样我们就会有更多的可能性，我们来看看其中的三个。假设你是系统管理员，你需要将日志文件的最后 30 行复制到 bug 报告中。在文本编辑器中打开文件，向下滚动到最后，复制和粘贴有一点工作量。为什么不使用 xclip 和 tail) 来快速轻松地完成？运行此命令以复制最后 30 行：tail -n 30 logfile.log | xclip -sel clip我的写作有相当一部分用于内容管理系统 （CMS） 或者在其他网络中发布。但是，我从不使用 CMS 的 WYSIWYG 编辑器来编写 - 我采用 Markdown 格式离线编写纯文本。也就是说，许多编辑器都有 HTML 模式。通过使用此命令，我可以使用 Pandoc 将 Markdown 格式的文件转换为 HTML 并将其一次性复制到剪贴板：pandoc -t html file.md | xclip -sel clip在其他地方，粘贴完成。我的两个网站使用 GitLab Pages 托管。我使用名为 Certbot 的工具为这些站点生成 HTTPS 证书，每当我更新它时，我需要将每个站点的证书复制到 GitLab。结合 cat) 命令和 xclip 比使用编辑器更快，更有效。例如：cat /etc/letsencrypt/live/website/fullchain.pem | xclip -sel clip这就是全部可以用 xclip 做的事么？当然不是。我相信你可以找到更多用途来满足你的需求。最后总结不是每个人都会使用 xclip。没关系。然而，它是一个在你需要它时非常方便的一个小工具。而且，正如我几次发现的那样，你不知道什么时候需要它。等到时候，你会很高兴能用上 xclip。via: https://opensource.com/article/19/7/xclip作者：Scott Nesbitt 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出