【问题标题】:SED: Combine text between two pattern in same lineSED:在同一行中的两个模式之间组合文本
【发布时间】:2013-02-26 17:14:59
【问题描述】:

我正在尝试使用 sed /awk 命令来解析我的文本文件。 我想在同一行的两个模式之间打印文本,并在其中添加一些字符。 前任: 如果我的线路是

uint8_t aucRepresentationName[NR_UNIT_REPRESENTATIONS][CHARS_P_REPRESENTATION];

uint8_t aucRepresentationName [NR_UNIT_REPRESENTATIONS] [CHARS_P_REPRESENTATION];

我要打印NR_UNIT_REPRESENTATIONS*CHARS_P_REPRESENTATION

所以,我盯着 sed 命令在 '[' 之后插入行分隔符 \n ,在合适的物种中划分行,然后尝试再次解析它。

echo "bla bla bla [AK] bla bla bla bla [A_K] bla bla bla" | sed 's/\[/\n&/g;' | awk '{sub(/.*\[ /,"");sub(/\].*/,"");print;}'

echo "bla bla bla [AK] bla bla bla bla [A_K] bla bla bla" | sed 's/\[/\n&/g;' | sed -e 's/^.*\[ //g;s/ \].*$//g'

而且它并不总是二维数组,它可以是无或单/双维数组,我需要首先有多少个[]实例,如果它的0然后写1,如果它的单维数组然后ex A[ SIZE] 然后写入 SIZE 其两个维度数组 ex:A[RAW][COL] 写入 RAW*COL..

我想知道我的命令有什么问题?或任何其他选择,因为它将帮助我进一步学习 sed。

阿姆鲁塔

【问题讨论】:

  • 没有名为 sed/awk 的工具。 sed 是在单行上进行简单替换的出色工具。对于所有其他文本操作,您应该使用 awk。您不需要学习 sed - 您可以从几个示例中了解您需要了解的所有内容。从阅读《Effective Awk Programming, Third Edition》这本书开始学习 awk。
  • 您的代码中的无维数组是什么样的?它是一个大小为 [] 的数组还是一个标量变量或其他东西?发布一些更具代表性的示例输入,其中包括您要解析的所有类型的数组声明以及给定该输入的预期输出。
  • 我的文本文件包含标量变量和一些数组。说 U8 A,U16 B[5],U16 B[4][2],u32 C[2][3][4].. 等等.. 我需要解析这个文件并将结果存储在文件中.. U8 1 U16 5 U16 4*2 U32 2*3*4
  • 您应该更新您的问题以显示具有代表性的示例输入和预期输出,而不是尝试在评论中向我们描述它,以便我们必须弄清楚示例输入。

标签: sed awk


【解决方案1】:

试试:

awk -F '[][]' '{print $2,$4}' OFS=\* file

好的,如果它是一个页面中单次出现的 0,1 或二维,您可以尝试:

awk -F '[][]' '{if(NF==3)print $2; else if(NF>4)print $2,$4; else print 1}' OFS=\* file

或不太容易理解;):

awk -F '[][]' '{$0=NF==3?$2:NF>4?$2 OFS $4:1}1' OFS=\* file

【讨论】:

  • 但它并不总是二维数组,它可能是无或单/双维数组,我需要首先有多少 [] 实例,如果它是 0,那么写 1,如果它是单维度数组然后 ex A[SIZE] 然后写入 SIZE 它的两个维度数组 ex:A[RAW][COL] 写入 RAW*COL..
  • 嗨,我正在尝试使用您上面提到的命令。命令是 echo $Readline | awk -F '[][]' '{$0=NF==3?$2:NF>4?$2 OFS $4:1}1' OFS=* 其中 readline 包含从文本文件中读取的行。令人惊讶的是,它可以在提示符下运行,但在我从 .sh 文件执行时却不行。它总是打印“1”我找不到原因
  • 很难说为什么会有差异。您能否提供示例输入文件和脚本详细信息并提供详细信息,例如操作系统、shell 和版本?
【解决方案2】:

使用这个:

perl -lne 'push @a,/\[([^\]]*)\]/g;END{print join "*",@a}'

修改自here 测试如下:

> echo "bla [AK] bla [A_K] 10" | perl -lne 'push @a,/\[([^\]]*)\]/g;END{print join "*",@a}'
AK*A_K

【讨论】:

    【解决方案3】:

    您可以尝试以下方法:

    echo "bla bla bla [AK] bla bla bla bla [A_K] bla bla bla" | sed 's/.*\[\(.*\)\].*\[\(.*\)\].*/\1*\2/g'
    

    AK*A_K

    【讨论】:

    • 但它并不总是二维数组,它可能是无或单/双维数组,我需要首先有多少 [] 实例,如果它是 0,那么写 1,如果它是单维度数组然后 ex A[SIZE] 然后写入 SIZE 它的两个维度数组 ex:A[RAW][COL] 写入 RAW*COL..
    【解决方案4】:

    使用 sed:

    sed -n 's/[^]]*\[\([^]]*\)\]\s*\[\([^]]*\)\].*$/\1*\2/p' input
    

    【讨论】:

      猜你喜欢
      • 2021-03-02
      • 2018-08-24
      • 1970-01-01
      • 1970-01-01
      • 2014-09-07
      • 1970-01-01
      • 1970-01-01
      • 2016-07-06
      • 1970-01-01
      相关资源
      最近更新 更多