【问题标题】:How to split triange brackets to couple of them?如何将三角括号拆分为几个?
【发布时间】:2019-11-07 15:20:23
【问题描述】:

我有文件包含这个

abc = <0x0 0x1>;
abc = <0x0 0x1 0x2>;
def = <0x0123 0x4567 0x89AB 0xCDEF>;
def = <0x0 0x1>;
def = <0x1 0x2 0x3 0x4>;
abc = <0x0 0x2 0x4 0x6>;
def = <0x0 0x1 0x2 0x3 0x4 0x5>;

我需要把它转换成

abc = <0x0 0x1>;
abc = <0x0 0x1 0x2>;
def = <0x0123 0x4567>, <0x89AB 0xCDEF>;
def = <0x0 0x1>;
def = <0x1 0x2>, <0x3 0x4>;
abc = <0x0 0x2 0x4 0x6>;
def = <0x0 0x1 0x2 0x3 0x4 0x5>;

我只需要将带有 4 个十六进制数字的三角括号拆分为一对括号,用逗号分隔,里面有 2 个十六进制数字,并且只在以 'def = ' (或 'def = '前面有任何符号)。如何使用 sed、awk 或 grep 做到这一点?

【问题讨论】:

  • 我们的目标是在您的问题中添加一些您自己的代码,以至少显示您为解决这个问题所做的研究工作。
  • 因为它不是从 'def = ' 开始的
  • @ComptrollerChanel,当然,请在您的帖子中添加您的努力,然后让我们知道。
  • 我什至不知道大致如何实现它
  • @ComptrollerChanel,我明白了,我们都在这里互相学习,所以我们鼓励用户在他们的问题上付出一些努力,当他们卡在某个地方时,他们会得到指导,你可以使用搜索本网站的功能也在发布之前。

标签: bash awk sed grep


【解决方案1】:

请您尝试关注一下。

awk '
/def/ && match($0,/<.*>/){
  val=substr($0,RSTART,RLENGTH)
  num=split(val,array," ")
  if(num==4){
    val=array[1] OFS array[2]">, <" array[3] OFS array[4]
  }
  $0=substr($0,1,RSTART-1) val substr($0,RSTART+RLENGTH)
}
1
' Input_file

如果您想将输出保存到 Input_file 本身,请在上面的代码中添加 &gt; temp &amp;&amp; mv temp Input_file

【讨论】:

  • 不起作用。输出与输入相同。也许它没有考虑到'def ='之前带有空格或制表符的行
  • @ComptrollerChanel,是的,我之前没有考虑过空格,请您现在检查一下吗?
【解决方案2】:

这可能对你有用(GNU sed):

sed -E '/^ *def =/s/(<\S+ \S+) (\S+ \S+>;)$/\1>, <\2/' file

如果一行以def = 开头并在&lt;&gt; 之间包含4 个字段,则在这些字段的第二个和第三个之间插入&gt;, &lt;

【讨论】:

    猜你喜欢
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 2015-12-14
    • 2021-11-19
    • 2018-06-01
    • 2017-03-12
    相关资源
    最近更新 更多