sed :在带有换行符的特定模式后插入行

2024-01-26

我们想要修改 plist 文件,以便在匹配模式后应该使用 sed shell 命令插入几行。

plist文件格式如下:

<plist> 
   <dict>
     .
     .
     <key>abc</key>
     <dict>
        .
        .
     </dict>
     .
     .
    </dict>
</plist>

我们想在找到第一个 dict 标签后插入几行。

如果我使用 follow 命令,它会插入到文件中的所有 dict 标记之后。

sed -i '' "/<dict>/ r template" info.plist

所以,我尝试找到 plist 和 dict 标签,然后插入行。

sed -i '' "/<plist version=\"1.0\">\n<dict>/r template" info.plist

or

sed -i '' "/\(^<plist version=*.\)/ r template" info.plist

这也不起作用,因为它无法在文件中找到模式。

请建议我如何放置包含两个由换行符分隔的字符串的模式。


sed 是一个出色的工具,可以在单行上进行简单替换,对于其他任何内容,只需使用 awk 即可。如果您在 sed 中使用除 s、g 和 p(带有 -n)以外的任何内容,那么您使用的是错误的工具和语言结构,这些工具和语言结构在 20 世纪 70 年代中期 awk 发明时就已经过时了。

有很多方法可以做到这一点。这是一个:

$ cat file1
<plist>
   <dict>
     .
     .
     <key>abc</key>
     <dict>
        .
        .
     </dict>
     .
     .
    </dict>
</plist>

.

$ cat file2
now is the
winter of
our discontent

.

$ awk 'NR==FNR{extra = extra $0 RS; next} {print} /<dict>/ && ++count==1{printf "%s", extra}' file2 file1
<plist>
   <dict>
now is the
winter of
our discontent
     .
     .
     <key>abc</key>
     <dict>
        .
        .
     </dict>
     .
     .
    </dict>
</plist>

想要在 dict 第二次出现而不是第一次出现后打印?只是改变==1 to ==2:

$ awk 'NR==FNR{extra = extra $0 RS; next} {print} /<dict>/ && ++count==2{printf "%s", extra}' file2 file1
<plist>
   <dict>
     .
     .
     <key>abc</key>
     <dict>
now is the
winter of
our discontent
        .
        .
     </dict>
     .
     .
    </dict>
</plist>

想要搜索跨越多行的模式而不是第 N 次出现的模式?以下是使用 GNU awk 实现多字符 RS 和 gensub() 的一种方法:

$ awk -v RS='^$' 'NR==FNR{extra=$0;next} {print gensub(/<plist>[[:space:]]+<dict>\n/,"&"extra,"")}' file2 file1
<plist>
   <dict>
now is the
winter of
our discontent
     .
     .
     <key>abc</key>
     <dict>
        .
        .
     </dict>
     .
     .
    </dict>
</plist>

所有与 awk 相关的琐事。

要使用任何 UNIX 命令更新原始文件,请执行以下操作:

command file > tmp && mv tmp file

所以在这种情况下是:

awk 'script' file > tmp && mv tmp file

GNU awk 有一个-i inplace与 sed 类似的参数-i如果您喜欢边际简洁,请在幕后创建 tmp 文件:

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

sed :在带有换行符的特定模式后插入行 的相关文章

  • [\b] 退格正则表达式有什么用?

    b 显然匹配退格字符 我无法理解字符串如何包含退格字符 有人能给我一个具体的例子来说明如何使用它吗 非常感谢 虽然所有其他人总体上都是正确的 即 b是单词边界 b does表示字符类中的退格键 b 这确实会匹配退格字符 它只是一个可以出现在
  • Scala 正则表达式替换为匿名函数

    在 Ruby 中 我可以通过以下方式替换字符串中的字符 a one1two2three a gsub d e e to i 1 gt one2two3three 从第二行开始评估块的结果将替换模式中匹配的内容 我们可以在 Scala 中做类
  • 如何使用存储在文本文件中的选项在 bash 中显示选择菜单? [复制]

    这个问题在这里已经有答案了 如何使用我存储在文本文件的各行中的选项为用户显示选择菜单 例如 我的文本文件 ingestion txt 如下所示 SOUP FTS CTS JDBC NEW 我希望用户看到这个 Please select an
  • 在 UITableViewCell 内动态更改标签宽度

    我正在尝试建立一个自定义表格视图 正如您在图片中看到的 我在故事板一侧将标签的宽度默认设置为 160 磅 并在加载表格时动态更改宽度 我通过修改 cellForRowAtIndexPath 委托方法来实现此目的 因此 根据日期的长度 我设置
  • 如何在不同目录中启动多个窗口的 tmux?

    我想使用脚本打开一个有 6 个窗口的 tmux 会话 每个窗口位于不同的目录中 我开始于我找到的一个脚本 http blog hawkhost com 2010 07 02 tmux E2 80 93 the terminal multip
  • “EXC_BAD_ACCESS”与“分段错误”。两者实际上相同吗?

    在我的前几个虚拟应用程序 用于学习时练习 中 我遇到了很多EXC BAD ACCESS 这以某种方式告诉我错误访问是 您正在触摸 访问一个不应该的对象 因为它尚未分配或释放 或者只是您无权访问它 查看此示例代码 该代码存在访问错误问题 因为
  • UIAlertAction 处理程序在延迟后运行

    我正在尝试将 UIAlertViews 更改为 UIAlertControllers 我为此设置了这个操作 UIAlertAction undoStopAction UIAlertAction actionWithTitle Undo St
  • 致命错误:在 flutter 中找不到“Flutter/Flutter.h”文件

    这是错误 在文件中包含来自 Users chetan pub cache hosted pub dartlang org webview flutter 1 0 7 ios Classes JavaScriptChannelHandler
  • bash循环跳过注释行

    我正在循环文件中的行 我只需要跳过以 开头的行 我怎么做 bin sh while read line do if line doesn t start with then echo line fi done lt tmp myfile 谢
  • 如何计算CLLocationDistance的中心坐标

    我想计算我的位置和一些注释之间的中心点 到目前为止我已经这样做了 CLLocation myLoc self locMgr location MKPointAnnotation middleAnnotation locationV anno
  • 如何设置 UINavigationbar 的渐变颜色?

    我想设置UINavigationbar backgroundColor渐变颜色 我想通过颜色数组设置它以创建渐变 理想情况下 作为内部的可访问方法UINavigationBar将其颜色更改为此渐变 有什么建议么 除了手动设置图像作为导航栏的
  • iOS5 和 Facebook API

    我想将我的应用程序与 Facebook 集成并从 github 下载 Facebook ios sdk 但是 该 sdk 适用于 Xcode 4 0 代码库 我正在使用 Xcode 4 2 for iOS 5 beta 5 应用程序 是否有
  • UIView 周围的虚线边框

    如何在周围添加虚线边框UIView 像这样的东西 如果您喜欢子层 还有另一种方法 在您的自定义视图的 init 中 输入以下内容 border 是 ivar border CAShapeLayer layer border strokeCo
  • 带有图像的 UITableView 滚动非常慢[重复]

    这个问题在这里已经有答案了 可能的重复 带图像的表格视图 加载和滚动缓慢 https stackoverflow com questions 4071497 table view with images slow load and scro
  • 匹配没有周围字符列表的单词列表

    我有这个正则表达式 one common word or another 除非这两个单词相邻 否则它匹配得很好 One one s more word word common word or another word more anothe
  • 如何在 iOS 6 中强制 UIViewController 为纵向

    As the ShouldAutorotateToInterfaceOrientation在 iOS 6 中已弃用 我用它来强制特定视图仅肖像 在 iOS 6 中执行此操作的正确方法是什么 这仅适用于我的应用程序的一个区域 所有其他视图都可
  • 应用程序仅启用纵向,但 UIImagePickerController 在 iOS6 中旋转

    请注意 下面的答案 不适用于 iOS6 所以我仍然需要答案 我的应用程序仅启用纵向模式 但是 如果我将 UIImagePickerController 作为子视图嵌入其中 并旋转设备 则顶部和底部栏将保持在同一位置 但 UIImagePic
  • AGVTool new-version 和 What-version 不对应

    当我做 agvtool new version all 99 它更新我的 Info plist 文件 但是 如果我这样做 agvtool what version or agvtool next version 我收到此错误 There d
  • 使用自定义格式将字符串转换为 NSDate [重复]

    这个问题在这里已经有答案了 可能的重复 NSString 到 NSDate https stackoverflow com questions 1353081 nsstring to nsdate iPhone 如何将 yyyyMMddTh
  • Swift:UICollectionViewCell didSelectItemAtIndexPath 更改背景颜色

    我可以轻松更改单元格的背景颜色CellForItemAtIndexPath method func collectionView collectionView UICollectionView cellForItemAtIndexPath

随机推荐