AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1781079
Accepted
Malaiselvan
Malaiselvan
Asked: 2023-04-27 13:18:44 +0800 CST2023-04-27 13:18:44 +0800 CST 2023-04-27 13:18:44 +0800 CST

sed 使用哪些选项来解析文件并写入新文件

  • 772

我正在调试别人编写的 LINUX 脚本。在脚本中我们有一行代码如下

sed -i "\#</resources>#{h;s#.*#cat /opt/abc/new.xml#e;G}" /opt/abc/tempmodule.xml 

它似乎在进行一些模式匹配和替换,然后将内容从 new.xml 复制到 tempmodule.xml。但是 sed 中使用的那些选项的含义是什么?这能解释一下吗。

到目前为止我的理解是

它试图</resources>在 tempmodule.xml 中查找文本“”并将内容替换为 new.xml

我不知道#这行是什么意思。但是当我查看 sed 手册时,它说注释行..但我不认为这里的意思不同。

shell-script
  • 2 2 个回答
  • 53 Views

2 个回答

  • Voted
  1. Best Answer
    dodrg
    2023-04-30T05:57:03+08:002023-04-30T05:57:03+08:00

    剧本

    sed -i "\#</resources>#{h;s#.*#cat /opt/abc/new.xml#e;G}" /opt/abc/tempmodule.xml 
    

    也可以这样写,这样可以加注释:

    #!/usr/bin/sed -i -f
    
                         # As separator "#" is used. Using "\#" prevents the
                         # line being interpreted as a comment.
    
    \#</resources>#{     # search the string "</resources>". if found execute:
    
        h                # store a copy of the buffer in the hold space.
    
        s#.*#cat /opt/abc/new.xml#e  
                         # substitute the whole line by "cat /opt/abc/new.xml"
                         # and "e" execute it in a shell. The new content of 
                         # the line is the content of "/opt/abc/new.xml".
                         # This might be multiple lines now.
    
        G                # To the changed content of the buffer append the 
                         # content of the hold space (the originally read line
                         # with the string "</resources>") as a new line at the
                         # end of the buffer.
    }
    

    该文件/opt/abc/tempmodule.xml是输入文件。该选项-i定义输出应转到输入文件并“就地”替换它——最后输入文件包含新内容。

    输入文件逐行读取到 sed 的缓冲区。无论是否被更改,在命令结束时缓冲区将被发送到输出并且通过将新行读取到缓冲区来重新开始循环。

    该脚本通过在(每一)行之前/opt/abc/tempmodule.xml插入内容来更改文件,因此将项目附加到 xml 对象“资源”的末尾。/opt/abc/new.xml</resources>

    • 2
  2. meuh
    2023-04-28T00:20:33+08:002023-04-28T00:20:33+08:00

    您可以在非常完整且易读的 GNU sed手册页中找到答案,尤其是s命令,它说:

    s 命令的语法是“s/regexp/replacement/flags”。

    / 字符可以统一替换为任何给定s命令中的任何其他单个字符。

    该s命令后面可以跟零个或多个以下标志:

    e此命令允许将来自 shell 命令的输入通过管道传输到模式空间...

    进一步我们有:

    4.3 文本匹配选行

    \%正则表达式%

    (% 可以替换为任何其他单个字符。)这也匹配正则表达式 regexp,但允许使用与 / 不同的分隔符。

    • 1

相关问题

  • 如何缩短 bash 中的变量名列表?

  • 发生某些输出后如何终止管道

  • 临时禁用 macOs 中的文件

  • 如何从 shell 脚本将插座电源切换到 Eaton ePDU G3

  • 文件描述符打开一次但关闭多次;为什么差异?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    Vickel Firefox 不再允许粘贴到 WhatsApp 网页中? 2023-08-18 05:04:35 +0800 CST
  • Martin Hope
    Saaru Lindestøkke 为什么使用 Python 的 tar 库时 tar.xz 文件比 macOS tar 小 15 倍? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve