繁体   English   中英

如何使用 sed 在文件的第一行插入文本?

[英]How do I insert text to the 1st line of a file using sed?

嗨,到目前为止,我正在尝试使用 sed 将文本添加到文件的第一行

#!/bin/bash
touch test
sed -i -e '1i/etc/example/live/example.com/fullchain.pem;\' test

而且这行不通也试过了

#!/bin/bash
touch test
sed -i "1i ssl_certificate /etc/example/live/example.com/fullchain.pem;" test

当我尝试时,这似乎并不奇怪

#!/bin/bash
touch test
echo "ssl_certificate /etc/example/live/example.com/fullchain.pem;" > test

当我使用cat test时,我会看到第一行文本,但是只要我输入sed -i "2i ssl_certificate_key /etc/example/live/example.com/privkey.pem;" 我在第 2 行看不到我应该做的信息,这是 ssl_certificate_key /etc/example/live/example.com/privkey.pem;

所以我要总结的问题

  1. 可以使用 sed 将文本插入到新创建文件的第一行吗?
  2. 如果是,在第一行文本之后插入文本的最佳方式是什么?

假设你有一个这样的file

one
two

然后附加到第一行:

$ sed '1 s_$_/etc/example/live/example.com/fullchain.pem;_' file
one/etc/example/live/example.com/fullchain.pem;
two

在第一行之前插入:

$ sed '1 i /etc/example/live/example.com/fullchain.pem;' file
/etc/example/live/example.com/fullchain.pem;
one
two

或者,在第一行之后追加:

$ sed '1 a /etc/example/live/example.com/fullchain.pem;' file
one
/etc/example/live/example.com/fullchain.pem;
two

请注意那些sed表达式中的数字1 - 这在sed术语中称为地址 它告诉您后面的命令要在哪一进行操作。

如果您的文件不包含您要寻址的行,则不会执行sed命令。 这就是为什么你不能在第 1 行插入/追加的原因,如果你的文件是空的。

而不是使用流编辑器,追加(到空文件),只需使用外壳重定向>>

echo "content" >> file

如果您确保输入文件至少有一行,您的命令将起作用:

[ "$(wc -l < test)" -gt 0 ] || printf '\n' >> test
sed -i -e '1 i/etc/example/live/example.com/fullchain.pem;\' test

您的问题源于sed无法找到您告诉它写入的行,例如:

touch test
sed -i -e '1i/etc/example/live/example.com/fullchain.pem;\' test

尝试在test的第 1 行写入插入,但此时该行不存在。 如果您已将文件创建为:

echo -en "\n" > test
sed -i '1i/etc/example/live/example.com/fullchain.pem;\' test

它不会抱怨,但你会多出一条线。 同样,当您调用:

sed -i "2i ssl_certificate_key /etc/example/live/example.com/privkey.pem;"

您告诉sed在第 2 行插入以下数据,该数据当时不存在,因此sed无法编辑文件。

因此,对于文件中的首行或最后一行,您不应该使用sed因为简单的>>>流重定向已经绰绰有余。

第一和最后

我假设任何搜索如何在文件的开头/结尾插入/附加文本的人可能也需要知道如何做另一个。

cal |                            \
  gsed -E                        \
       -e     '1i\{'             \
       -e     '1i\  "lines": ['  \
       -e 's/(.*)/    "\1",/'    \
       -e '$s/,$//'              \
       -e     '$a\  ]'           \
       -e     '$a\}'

说明

这是cal输出管道输送到gnu- sed (称为gsed上经由安装MACOS brew.sh )与正则表达式扩展( -E )和6“脚本”应用于( -e )和换行与转义\\以提高可读性。 脚本 1 和 2 使用1i\\来“在第 1 行,插入”。 脚本 5 和 6 使用$a\\来“在 <last> 行,追加”。 我垂直对齐文本输出以使代码代表结果中的预期内容。 脚本 3 和 4 进行替换(后者仅适用于“行 <last>”)。 结果是将命令输出转换为有效的 JSON。

输出

{
  "lines": [
    "    October 2019      ",
    "Su Mo Tu We Th Fr Sa  ",
    "       1  2  3  4  5  ",
    " 6  7  8  9 10 11 12  ",
    "13 14 15 16 17 18 19  ",
    "20 21 22 23 24 25 26  ",
    "27 28 29 30 31        ",
    "                      "
  ]
}

如需帮助使其与 sed 的 macos/BSD 版本一起使用,请在此处查看我的回答

在 macOS 上使用 sed 将文本插入第一行并将其余部分放在新行上,这对我有用

sed -i '' '1 i \
Insert
' ~/Downloads/File-path.txt

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM