在 bash 中的模式和下一次出现的相同模式之间添加带有文本的行
我正在编写一个 bash 脚本来修改如下所示的文件:
--- usr1 ---
数据数据数据数据数据
数据数据数据数据数据
数据数据数据数据数据
--- usr2 ---
数据数据数据数据数据
数据数据数据数据数据
--- usr3 ---
数据数据数据数据
--- endline ---
一个问题是:如何在最后一个用户数据行之后添加下一个用户行 --- usrn ---
? 第二个是:如何删除特定的用户数据行(数据行和--- userx ---
)即我想删除usr2及其所有数据集。
它必须在 bash 2.05 上工作:)并且我认为它将使用 awk 或 sed,但我不确定。
这里稍微编辑一下:实际上用户名没有编号。我们不知道用户会想出什么。我们只知道名称将位于 ---
模式内
I am writing a bash script that modifies a file that looks like this:
--- usr1 ---
data data data data
data data data data
data data data data
--- usr2 ---
data data data data
data data data data
--- usr3 ---
data data data data
--- endline ---
One question is: How to add next user line --- usrn ---
after last user data lines?
Second one is: How to delete specific user data lines (data lines and --- userx ---
) i.e. I would like to delete usr2 with all his data set.
It must work on bash 2.05 :) and I think it will use awk or sed, but I'm not sure.
A little edit here: In fact usernames are not numbered. We don't know what users will come up with. We only know that the name will be inside ---
pattern
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
给定变量中的用户名:
删除用户部分:
或对于某些版本的
sed
(编辑):编辑:可能的变体以适应前导和尾随空格:
添加下一个用户部分:
或者
如果您的 sed 版本支持就地更改,您可以执行以下操作:
否则,您将不得不使用临时文件:
最好使用
mktemp
或tempfile
等实用程序用于创建临时文件并使用提供的名称。Given a username in a variable:
Delete a user section:
or for some versions of
sed
(edited):Edit: a possible variation to accommodate leading and trailing whitespace:
Add the next user section:
or
If your version of
sed
supports in-place changes, you can do:Otherwise, you'll have to use a temporary file:
It's best to use a utility like
mktemp
ortempfile
to create a temporary file and use the name provided.第二部分的 awk 解决方案:
如果头与要删除的用户匹配,则将关闭
p
标志,否则它将打印每一行。An awk solution for the 2nd part:
This turns the
p
flag off if the head matched the user to delete, otherwise it prints every line.普通 shell 可以处理这个
更新答案以包含第二个要求...
用法类似于:
sh newuser.sh
sh newuser.sh 用户表.txt > newusertable.txt
顺便说一句,还有另一种编写 shell 脚本的风格,我可以将其称为“gnu configure”格式。在“另类风格”中,主循环将是:
Plain shell can handle this
Updated answer to include the second requirement...
Usage is something like:
sh newuser.sh < usertable.txt > newusertable.txt
By the way, there is an alternative style of writing shell scripts which I might call "gnu configure" format. In "alternative style" the main loop would be: