【问题标题】:How to remove space between two line and make it as one and delete using shell script如何删除两行之间的空格并将其设为一并使用shell脚本删除
【发布时间】:2022-10-24 21:05:27
【问题描述】:

我想从下面添加的文件中删除以下部分。

  1. 无法从文件中删除 credentials.admin.adapters 此属性

  2. 它删除了同一行中的其他属性。

  3. 如何在同一行的< > 这个字符之间添加内容。

    <!--<UndefineProperty name="credentials.admin.adapters"/>-->
    <!--<AddToProperty name="credentials.admin.adapters"
               value="com.Ldap^cn=Manager^encrypted.com.Ldap.cn=admin"/>-->
    <Property name="credentials.admin.adapters" overridable="true"
          targetFile="Credentials.txt"
          value="com.Ldap^id=proxy"/>
    <!--<UndefineProperty name="credentials.admin.adapters"/>
    <AddToProperty name="credentials.admin.adapters"
               value="com.Ldap^cn=admin^encrypted.com.Ldap.cn=admin"/> -->
    

    新配置文件

    <!--<UndefineProperty name="credentials.admin.adapters"/>-->
    <!--<AddToProperty name="credentials.admin.adapters"
                  value="com.Ldap^cn=Manager^encrypted.com.Ldap.cn=admin"/>-->
    <Property name="credentials.admin.adapters" overridable="true"
             targetFile="Credentials.txt"
             value="com.Ldap^id=proxy"/>
    <Property name="pom.dbUser" overridable="true" targetFile="db.properties"
             value="NM"/>
    <Property name="pom.jdbc.host" overridable="true" targetFile="db.properties"
             value="0038.rds.amazonaws.com"/>
    <Property name="pom.dbPassword" overridable="true" targetFile="db.properties"
             value="encrypted.pom.dbPassword"/>
    <Property name="pom.serviceName" overridable="true" targetFile="db.properties"
             value="rds.amazonaws.com:10:0038"/>
    <Property name="pom.jdbc.service" overridable="true" targetFile="db.properties"
             value="0038"/>
    <Property name="pom.jdbc.port" overridable="true" targetFile="db.properties"
             value="10"/>
    <ConfigurationRef xlink:href="utilities/configurator.xconf"/>
    <ConfigurationRef xlink:href="owl.xconf"/>
    <ConfigurationRef xlink:href="ser.xconf"/>
    <!--<UndefineProperty name="credentials.admin.adapters"/>
    <AddToProperty name="credentials.admin.adapters"
                  value="com.Ldap^cn=admin^encrypted.com.Ldap.cn=admin"/> --><Property 
     name="com.distproc.credential" overridable="true"
             targetFile="distproc.properties"
             value=""/>
     </Configuration>
    

    我在下面试过:

    sed -i '/value=/N; s/\n\s*/ /g' newconf.txt
    sed -i "/credentials.admin.adapters/d" newconf.txt
    

    但上面的代码也删除了其他属性。

    我想要以下输出:

    <Property name="pom.dbUser" overridable="true" targetFile="db.properties" value="NM"/>
    <Property name="pom.jdbc.host" overridable="true" targetFile="db.properties" value="0038.rds.amazonaws.com"/>
    <Property name="pom.dbPassword" overridable="true" targetFile="db.properties" value="encrypted.pom.dbPassword"/>
     <Property name="pom.serviceName" overridable="true" targetFile="db.properties" value="rds.amazonaws.com:10:0038"/>
     <Property name="pom.jdbc.service" overridable="true" targetFile="db.properties" value="0038"/>
       <Property name="pom.jdbc.port" overridable="true" targetFile="db.properties" value="10"/>
     <ConfigurationRef xlink:href="utilities/configurator.xconf"/>
     <ConfigurationRef xlink:href="owl.xconf"/>
      <ConfigurationRef xlink:href="ser.xconf"/>          
     <Property name="com.distproc.credential" overridable="true" targetFile="distproc.properties" value=""/>
     </Configuration>
    

    删除以下行:

     <!--<UndefineProperty name="credentials.admin.adapters"/>-->
    <!--<AddToProperty name="credentials.admin.adapters" value="com.Ldap^cn=Manager^encrypted.com.Ldap.cn=admin"/>-->
    <Property name="credentials.admin.adapters" overridable="true" targetFile="Credentials.txt" value="com.Ldap^id=proxy"/>
    <!--<UndefineProperty name="credentials.admin.adapters"/>
    <AddToProperty name="credentials.admin.adapters" value="com.Ldap^cn=admin^encrypted.com.Ldap.cn=admin"/> -->
    

【问题讨论】:

  • 输出行以空格开头而哪些不以空格开头的基本原理是什么?
  • 你能解释一下吗?
  • 在您预期的输出中,前 3 行从行首开始,然后接下来的 2 行缩进 1 个空格,然后接下来的行缩进 3 个空格,然后 2 行缩进 1 个空格,然后 1 行缩进 2空白,然后最后 2 行再次缩进 1 个空白。为什么?是什么决定了每个输出行缩进多少个空格?

标签: shell sed


【解决方案1】:

使用sed

$ sed -z ':a;s/([^
]*)
 +/ /;ta;s/>(<[^>]*>) /

/' input_file | sed '/credentials.admin.adapters/d'
<Property name="pom.dbUser" overridable="true" targetFile="db.properties" value="NM"/>
<Property name="pom.jdbc.host" overridable="true" targetFile="db.properties" value="0038.rds.amazonaws.com"/>
<Property name="pom.dbPassword" overridable="true" targetFile="db.properties" value="encrypted.pom.dbPassword"/>
<Property name="pom.serviceName" overridable="true" targetFile="db.properties" value="rds.amazonaws.com:10:0038"/>
<Property name="pom.jdbc.service" overridable="true" targetFile="db.properties" value="0038"/>
<Property name="pom.jdbc.port" overridable="true" targetFile="db.properties" value="10"/>
<ConfigurationRef xlink:href="utilities/configurator.xconf"/>
<ConfigurationRef xlink:href="owl.xconf"/>
<ConfigurationRef xlink:href="ser.xconf"/>
<Property  name="com.distproc.credential" overridable="true" targetFile="distproc.properties" value=""/>
</Configuration>

低于不稳定的输出:

value="NM"/>e="pom.dbUser" overridable="true" targetFile="db.properties"
value="0038.rds.amazonaws.com"/>erridable="true" 
targetFile="db.properties"
value="encrypted.pom.dbPassword"/>rridable="true" 
targetFile="db.properties"
value="rds.amazonaws.com:10:0038"/>rridable="true" 
targetFile="db.properties"
value="0038"/>"pom.jdbc.service" overridable="true" 
 targetFile="db.properties"
value="10"/>e="pom.jdbc.port" overridable="true" 
targetFile="db.properties"
<ConfigurationRef xlink:href="utilities/configurator.xconf"/>
<ConfigurationRef xlink:href="owl.xconf"/>
 <ConfigurationRef xlink:href="ser.xconf"/>

【讨论】:

  • 我在 Online Bash Shell 上试​​过这个,但它对我不起作用。
  • @Shr那是不可能的,除非您复制和粘贴错误。看看这里ideone.com/7mwKve 再一次,我认为你有你自己的数据,你没有与我们分享,因此为什么它不适合你。
  • 您是否尝试过文件输入?检查我当前的 o/p。
  • 有用 !!谢谢 !!! [^c] [^>]*>[^<]* --> 你能解释一下这部分吗?
  • @Shr那些是非贪婪的匹配。 [^c]* - 匹配所有内容,直到下一次出现小写 c。 [^>]*> - 匹配所有内容,直到下一次出现 > 并在匹配中包含 >。
【解决方案2】:

你只需要一个大的FS 和两个gsub() 的电话:

{m,g}awk '
gsub("[ 	]*
+[ 	]+"," ",$!(NF=NF))+gsub("[>][	 ]*
]+[<]",">
<")^_' RS='^$' OFS=
FS='([<]!--)?[<][^></=]+="credentials[.]admin[.]adapters"[^>]*[>]( *--[>])?
*|
+$'  

=

<Property name="pom.dbUser" overridable="true" targetFile="db.properties" value="NM"/>
<Property name="pom.jdbc.host" overridable="true" targetFile="db.properties" value="0038.rds.amazonaws.com"/>
<Property name="pom.dbPassword" overridable="true" targetFile="db.properties" value="encrypted.pom.dbPassword"/>
<Property name="pom.serviceName" overridable="true" targetFile="db.properties" value="rds.amazonaws.com:10:0038"/>
<Property name="pom.jdbc.service" overridable="true" targetFile="db.properties" value="0038"/>
<Property name="pom.jdbc.port" overridable="true" targetFile="db.properties" value="10"/>
<ConfigurationRef xlink:href="utilities/configurator.xconf"/>
<ConfigurationRef xlink:href="owl.xconf"/>
<ConfigurationRef xlink:href="ser.xconf"/>
<Property name="com.distproc.credential" overridable="true" targetFile="distproc.properties" value=""/>
</Configuration>

【讨论】:

  • 我可以在 sed 中获得 o/p 吗?
  • @Shr:这只是一个regex。使用sed -E/-r 标志,您几乎可以直接一对一地复制和粘贴它们。您需要花一些时间真正了解这些代码在做什么,而不是让我们为您做sed 部分。
  • 我尝试使用 awk,但它最终无法正常工作。
  • 给我看错误信息。 ps:{m,g}awk 不是一个带有大括号的实际命令名称 - 我的意思是它经过测试并确认适用于 mawkgawk
猜你喜欢
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
  • 2015-03-12
  • 2022-01-20
  • 2019-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多