[英]sed -i is not working on solaris system while removing 1st line from file
[英]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;
所以我要总结的问题
假设你有一个这样的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.