使用 Bash 从文本文件中提取标记的字符串

我有以下样式的文件 - 这些是参数化排列提交; #characters 中的值会根据大气根据数据库中的实际值进行更改。

ABC=#PARAMETER_1#:#PARAMETER_2#
SOMETHING_ELSE=#PARAMETER_1#
SOMETHING_NEW=#PARAMETER_2##PARAMETER_3#

我想从这些文档中提取哈希/磅(#)个性之间的值,以确保我可以轻松确定所需的参数。 没有标准的列宽或类似的东西,唯一的标准是两个 # 字符之间的任何内容都替换为数据源中的值。

这是最佳的清洁、重复数据删除结果:

PARAMETER_1
PARAMETER_2
PARAMETER_3

我已经看到 这个 的担忧,但重要的区别是在我的情况下,特定行上可以有任意数量的变量。

我已经用 Bash 标记了这个查询,但是它不需要,也许 perl 等,它只需要从 Unix 的命令行运行。

1
2022-06-07 14:36:23
资源 分享
答案: 1

作为第一个想法,awk

awk -vRS='#[^#]+#' 'RT{gsub(/#/,"",RT);p[RT]=1}END{for(i in p)print i}' the_file

但此选择可能取决于您必须执行的其他操作。


说明正如评论中要求的那样。

awk -vRS='#[^#]+#' '   # use /#[^#]+#/ as record separator
RT {   # record terminator not empty?
  gsub(/#/,"",RT)    # remove the # parameter delimiter markup
  p[RT]=1   # store it as key in array p
}
END {   # end of input?
  for (i in p) print i   # loop through array p and print each key
}' the_file

重要的部分是使用 RT(记录终止符)内置变量:

   RT          The record terminator.  Gawk sets RT to the input text that
               matched the character or regular expression specified by
               RS.
5
2022-06-07 14:59:50
资源