使用 Awk 或 Sed 在特定行的末尾附加语句

2024-02-10

我有一个我命名的文件poscar1.cif,我想在此文件的特定行插入变量的内容。

例如,线24,当前内容为:

_cell_length_a

我想添加变量的内容a(在我的函数中定义为a=5.3827)这样该行现在显示为:

_cell_length_a 5.3827

有没有办法使用 sed 或 awk 来做到这一点?我正在使用 bash 脚本来完成此操作(不幸的是,完整的脚本太大,无法发布)。


自从老将ed http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ed.html实用程序不再受到足够的关注:

a=5.3827

ed -s poscar1.cif <<EOF 
g/^_cell_length_a\$/ s//& $a/
w
EOF

ed truly edits a file in place, unlike sed with its -i option[1].

sed借用了很多功能ed,因此在功能上存在显着的重叠,但也存在重要的差异,其中一些差异在这里体现出来。

  • -s抑制ed的状态消息。
  • poscar1.cif是要就地编辑的输入文件。
  • <<EOF ... is the 此处文档 http://mywiki.wooledge.org/HereDocument其中包含以下命令ed - ed要求其命令来自stdin并且每个命令都独占一行。
  • g/^_cell_length_a\$/ ... is a (basic) regex (regular expression) that matches all lines that exactly contain _cell_length_a - the g ensures that no error is reported if there's no match at all.
    • 请注意,$ is \-转义以保护它不被解释shell在此处文档内(并非绝对必要)this实例,但很好的做法)。
  • s//& $a/ ... // repeats the search for the most recently used regex on a matching line and replaces the match with itself (&), followed by a space and the value of variable $a.
    • 请注意,由于开始分隔符 (EOF)此处文档是unquoted, shell变量扩展确实发生;本质上,shell 将这些内容视为双引号字符串的内容。
  • w writes the modified buffer back to the input file.
    • 为了调试,使用,p代替w以便仅print修改后的缓冲区,而不将其写回文件。

[1] 重新就地更新:

更确切地说,ed保留文件的现有状态inode,这确保了所有文件的属性被保留。
然而,它确实not覆盖现有文件的各个字节,但是读到entire文件存入内存中的缓冲区,并根据要求将整个缓冲区写入文件。
这使得ed仅适用于足够小的文件作为一个整体读入内存.

相比之下,sed -i (GNU and BSD sed), its GNU4.1+对应,awk -i inplace,并且perl -i replace原始文件带有新创建的 one,这意味着他们:

  • destroy symlinks(!) - if the input file was a symlink, it is replaced with a regular file of the same name
    • 一个重要的常见场景:比如说你的 shell 初始化文件~/.bashrc is a symlink到您在源代码控制下保存的其他地方的文件;然后你安装一个使用的工具sed -i修改~/.bashrc,这会导致它被替换为常规文件,并且源代码控制版本的链接已损坏。
    • 更重要的是,BSDsed的行为甚至会带来安全风险(见下文)。
  • do not保存原始文件创建日期(如果支持的话;例如,在 OSX 上)
  • they do, 然而,

    • 保存扩展属性(如果支持的话;例如,在 OSX 上)
    • 保存文件权限

      • Caution: BSD sed introduces a security risk with respect to symlinks (behavior still present as of the version that comes with FreeBSD 10):
        • The symlink的权限被复制到替换文件,而不是符号链接target的。由于符号链接得到可执行文件默认权限,你总是会得到一个可执行文件 file,输入文件是否可执行。
      • 幸运的是,GNU sed正确处理这种情况。

sed, gawk, and perl could通过采取额外的步骤来解决上述问题,但有只有保留原始索引节点才能确保一件事,如ed does:

当监视文件的更改时通过其索引节点号(例如,tail -f),不保留 inode 会破坏监控。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Awk 或 Sed 在特定行的末尾附加语句 的相关文章

  • 为什么 **sort** 不在每台机器上进行相同的排序?

    使用相同的sort具有相同输入的命令在不同的机器上产生不同的结果 我该如何解决这个问题 The man page http developer apple com documentation Darwin Reference ManPage
  • brew install python,但随后:“python-2.7.6 已安装,只是未链接”

    免责声明 菜鸟 操作系统 10 8 5 当我在 bash 中安装 python 时 我得到了这个警告和错误 https i stack imgur com TBgBT png Warning Could not link python Un
  • 创建证书以通过 bash 在 Mac OS X 上签署 GDB

    我正在尝试通过以下方式在 Mac OS X 上安装 gdblink1 http www patosai com blog post installing gdb on mac os x yosemite and link2 http ntr
  • 使用 tac 和 sed 反转文件

    我有一个用例 我需要搜索并替换文件中最后一次出现的字符串并将更改写回文件 下面的案例是该用例的简化版本 我正在尝试反转该文件 进行一些更改 再次将其反转并写入该文件 我为此尝试了以下代码片段 tac test sed s a b sed i
  • sed 将带空格的行插入到特定行

    我在开头有一行空格 例如 Hello world 我想将此行插入到文件中的特定行 例如 将 hello world 插入下一个文件 hello world result hello hello world world 我正在使用这个 sed
  • 如何从 Unix 文件中删除空行

    我需要从输入文件中删除所有空白行并写入输出文件 这是我的数据如下 11216 33 1032747 64310 1 0 0 1 878 0 0 0 1 1 1 087 5 1 1 18 JAN 13 000603221321 11216 3
  • AWK 中多行的匹配正则表达式。 && 操作员?

    我不确定 运算符在正则表达式中是否有效 我想做的是匹配一行 使其以数字开头并具有字母 a 下一行以数字开头并具有字母 b 并且下一行 字母 c 该 abc 序列将用作开始读取文件的唯一标识符 这就是我在 awk 中想要的东西 0 9 a n
  • 如何通过ssh获取远程命令的退出代码

    我正在通过 ssh 从远程计算机运行脚本 ssh some cmd my script 现在 我想在本地计算机上存储 shell 脚本的退出状态 我该怎么做 假设没有任何问题ssh其本身 其退出状态是在远程主机上执行的最后一个命令的退出状态
  • sed 替换为多行变量[重复]

    这个问题在这里已经有答案了 我正在尝试用跨多行的文本替换单词 我知道我可以简单地使用换行符 n 来解决这个问题 但我想保持字符串 干净 不包含任何不需要的格式 下面的例子显然是行不通的 read r d TEST lt
  • 选择fasta文件中氨基酸超过300个且“C”出现至少4次的序列

    我有一个包含蛋白质序列的 fasta 文件 我想选择超过 300 个氨基酸且半胱氨酸 C 氨基酸出现超过 4 次的序列 我使用此命令来选择具有超过 300 个 aa 的序列 cat 72hDOWN fasta fasta bioawk c
  • shell脚本中的“##”是什么意思? [复制]

    这个问题在这里已经有答案了 在编写脚本时 我遇到了这个命令 f file 我很想知道 什么是 这行是什么意思 In bash 它删除了前缀模式 在这里 它基本上为您提供了最后一个路径分隔符之后的所有内容 通过贪婪地删除前缀 后面跟随任意数量
  • bash while 循环的布尔表达式中的 -lt 意味着什么?

    我猜测它代表小于基于输出 但是我在哪里可以找到有关此语法的文档 bin bash COUNTER 0 while COUNTER lt 10 do echo The counter is COUNTER let COUNTER COUNTE
  • 正则表达式删除块注释也删除 * 选择器

    我正在尝试使用 bash 从 css 文件中删除所有块注释 我有以下 sed 命令的正则表达式 sed r s w s w d 这可以很好地去除块注释 例如 This is a comment this is another comment
  • 检查 bash 中是否存在关联数组元素

    在 bash 脚本中 我在变量中有一个区域设置 如下所示 locale fr ma 我也有一个像这样的关联数组 declare A new loc map new loc fr ma en ma new loc el gr en gr ne
  • 将 JSON 导出到环境变量

    如果我有这样的 JSON hello1 world1 testk testv 我想将每个键值对导出为环境变量 如何通过 shell 脚本来做到这一点 例如 当我在终端上写时 echo hello1 world1应该打印其他键值对吗 注意 上
  • 如何从 ssh 配置文件中删除主机条目?

    文件的标准格式是 Host example HostName example com Port 2222 Host example2 Hostname two example com Host three example com Port
  • 比较两个文件的单列

    我有两个文件 每个文件都有两列 并用空格分隔 我想找到两个文件中第 2 列不相同的行 并将它们输出到第三个文件 file A 1 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 2 BBBBBBBBBBBBBBBBBBBBBB
  • Bash:递归复制命名文件,保留文件夹结构

    我希望 cp R src prog js images icon jpg tmp package 将在目标目录中产生对称结构 tmp package src prog js images icon jpg 但相反 这两个文件都被复制到 tm
  • bash 子 shell 中出现陷阱“kill 0”的分段错误

    我正在尝试编写一个并行构建多个 Dockerfile 的小脚本 但是如果我想取消该脚本 我也想杀死子进程 这样做的结果是segmentation fault 不知道为什么 为了澄清我正在杀死脚本 C trap kill 0 SIGINT S
  • AWK:递归下降 CSV 解析器

    响应一个BASH 中的递归下降 CSV 解析器 https codereview stackexchange com questions 11727 need some advice or help with translation and

随机推荐

  • 模拟输入:按键按下、按住和释放

    我试图模拟用户按下某个键 按住某个键一段特定的时间间隔 然后释放它 我尝试使用来实现这个SendKeys Send 但我不知道如何控制按键的持续时间 我不想一遍又一遍地发送相同的密钥 我想要一个按键按下和一个按键弹起事件 例如 我有这样的代
  • 在同一个 ios 项目中使用 2 个版本的 AFNetworking

    我有一个项目 我使用了 AFNetworking 2 0 不是可可豆荚 刚刚添加到项目中 然后 我实现了日历 MSCollectionViewCalendarLayout 它在 pod 中打包了一些依赖项 其中之一是 RestKit gt
  • 如何通过 aot 编译在 Angular 中提供备用 i18n 语言链接?

    我目前正在开发 Angular 应用程序的 i18n 我使用 AOT 编译 xlf 文件来创建预编译的应用程序 如下所述here https angular io docs ts latest cookbook i18n html 在构建中
  • jQuery $(document).ready 在 Iron/Chrome 中损坏

    我使用 jQuery 和 jFancyTiles 编写了一个小图像幻灯片 可以在此处看到 http www netzwerkag at http www netzwerkag at 它在 Firefox 和 IE 中按预期工作 但在 Iro
  • Google Chart:如何绘制条形图的垂直线

    我正在尝试添加一条垂直线 以便当元素超过该值时可以在视觉上有所区别 Thanks
  • DatePickerDialog标题背景颜色

    我已经为 DatePickerDialog 背景设置了样式 它在 Nexus 5 Marshmallow 上的显示有所不同 我使用的风格是
  • 将 Antlr 语法树转换为有用的对象

    我目前正在考虑如何最好地获取使用 Antlr 生成的 AST 并将其转换为可以在我的程序中使用的有用对象 我语法的目的 除了学习之外 是创建一种可执行 运行时解释 语言 例如 我将如何获取属性子树并实例化特定的属性类 例如 以下代码用我的语
  • 有没有办法将 bash 中的输出重定向到具有不同过滤器的不同位置?

    如果我有一个过程a out我可以 a out grep foo查看由 foo 过滤的 a out 的标准输出 我也可以说 a out 2 gt 1 grep foo查看 foo 过滤的 err 和 out 随着tee命令我可以将标准输出发送
  • 从另一个类访问私有方法

    我有两个存储库类 RepositoryFactory and BaseRepository 在同一项目中实现不同的接口 这BaseRepository类有一个私有方法 现在另一个类中也需要该方法 具有相同的实现 我没有重复该方法以保持其私有
  • 带小数的负数的Javascript正则表达式

    我想测试这个输入 可选的负号 2 位数字 可选的 和一个可选的数字 如下所示 34 or 34 5333 or 34 53333 or 34 in JavaScript 这是我想出来的 但行不通 d 2 d 1 有人可以帮帮我吗 试试这个正
  • 使用 PHP 进行实时视频流传输

    我有一个 PHP AJAX MYSQL 聊天应用程序 我想将视频聊天添加到我的应用程序中 如何在 PHP 应用程序中创建用于实时视频会议 聊天的实时视频流 如果我想构建这样一个系统 我需要了解哪些关键术语 首先使用 PHP 是个好主意吗 有
  • 缩略图淡入淡出

    这是缩略图的标记 ul li a href videos img class thumb src images background thumb1 jpg alt a li li a href images background ibiza
  • Rails:构建捆绑器 gemfile 的选项

    我有一个宝石 必须使用一些选项来构建它 gem install pg with pg include Library PostgreSQL 9 0 include with pg lib Library PostgreSQL 9 0 lib
  • 我们如何将结果数据从 CodeIgniter 控制器传递到 AngularJS 控制器?

    我们如何将结果数据从 CodeIgniter 控制器传递到 AngularJS 控制器 在使用 jsonSuccess 代码的 CodeIgniter 控制器中 我将数据传递给 AngularJS 但我想传递不同的 3 个变量 我需要如何传
  • 当且仅当类模板会实例化时,变量模板才是正确的?

    假设我有一个类模板 A 它具有一个类型模板参数和一个主要特化 template
  • 如何在 React Query 中将 debounce 与 useQuery 一起使用?

    我正在使用 React Query 从 React 应用程序中的 API 获取数据 我想实现去抖以获得更好的性能 但我无法让它与 useQuery 一起使用 当我尝试将 API 调用包装在去抖函数中时 收到一条错误消息 查询函数必须返回定义
  • .NET / LINQ-SQL / ASP.NET 中的连接字符串地狱

    我有一个网络应用程序 包含以下内容 一个 Web 项目 带有包含连接字符串的 web config 文件 但 Web 项目中没有数据访问代码 使用 LINQ SQL 类向 Web 项目 UI 提供实体的数据访问项目 该项目有一个设置文件和一
  • 使用 Apps 脚本在 Google Drive 中创建 zip 文件

    我在 Google Drive 文件夹中有一个包含几个文件的文件夹 我想制作一个 Google Apps 脚本 它将压缩该文件夹中的所有文件并在同一文件夹中创建 zip 文件 我发现一个视频有Utilities zip 函数 但没有相关的
  • Span 和二维数组

    是否可以使用新的System Memory Span 结构体 https msdn microsoft com en us magazine mt814808 aspx使用二维数据数组 double testMulti 1 2 3 4 5
  • 使用 Awk 或 Sed 在特定行的末尾附加语句

    我有一个我命名的文件poscar1 cif 我想在此文件的特定行插入变量的内容 例如 线24 当前内容为 cell length a 我想添加变量的内容a 在我的函数中定义为a 5 3827 这样该行现在显示为 cell length a