【问题标题】:AWK function to grab profiles for gnome-terminal用于获取 gnome-terminal 配置文件的 AWK 功能
【发布时间】:2021-02-19 06:31:32
【问题描述】:

我希望能够通过使用某种正则表达式和过滤名称轻松地将我的 gnome 终端的某些配置文件传输到另一台计算机。 grep 不允许在换行符之间进行搜索,我希望 awk(在 Ubuntu 上技术上为 mawk)具有该功能。个人资料如下所示:

[:c812de27-9bc9-414b-a263-4995c1ec775a]
background-color='rgb(31,36,40)'
palette=['rgb(106,115,125)', ...array of colors]
scroll-on-output=true
scrollbar-policy='never'
use-theme-colors=false
use-theme-transparency=false
visible-name='gh_dark'

这些配置文件在通过dconf 转储时由换行符分割

到目前为止,我已经尝试过grep,但由于它不允许匹配换行符(我在尝试grep "\[:.*\].*visible-name:'gh_dark'" 后发现),我无法确定几个。我查看了-A 标志,但由于无法知道特定配置文件将有多少行,这似乎不实用。

给定名称,我想要的是像上面一样的输出,很容易看到完整的配置文件配置

我想知道是否有一种方法可以使用 awk 通过抓取 id(在顶部)和名称轻松地对这些进行排序,以便轻松找出要单独导出的那些(需要 id)或只是直接把它们拉出来放在一个文件里

【问题讨论】:

  • 欢迎来到 SO,请在您的问题中添加您的努力以及示例预期输出,以便更好地理解问题,谢谢。
  • 好的,谢谢@RavinderSingh13
  • 感谢您的努力,当找到visible-name='gh_dark' 的条目时,您能否确认是否要在您的文件中打印博客的输出?抱歉,它还没有明确预期的输出。
  • 是的,在寻找PROFILE_NAME(本例为gh_dark)时,找到visible-name:'${PROFILE_NAME}'时触发输出
  • 接受的答案纯粹是基于正则表达式的,所以它是正确的标签。

标签: awk grep


【解决方案1】:

像这样使用 GNU grep

grep -Pzo '(?s)\[:.*?visible-name.*?\n' in_file

这里,grep 使用以下选项:
-P:使用 Perl 正则表达式。
-o:仅打印匹配项(每行 1 个匹配项),而不是整行。
-z :将输入和输出数据视为行序列,每行都以零字节(ASCII NUL 字符)而不是换行符结尾。因此,您可以匹配输入中的换行符。

(?:s) :启用s pattern-match modifier,以允许. 匹配换行符。

另请参阅:
grep manual
perlre - Perl regular expressions

【讨论】:

    【解决方案2】:

    对于您显示的示例,您能否尝试以下操作。在这里使用tac + awk 组合。因为我有 GNU awk 所以检查了它,我相信应该也可以与 mawk 一起使用。

    tac Input_file |
    awk -v profileName="$profilename" '
    match($0,"visible-name=\047" profileName "\047"){
      found=1
    }
    found;
    /^\[:/{
      found=""
    }' | tac
    

    解释: 首先tac 将从下到上打印 Input_file(相反的方式使我们在比较方面更容易)。然后程序会将tac 的输出传递给awk 程序和名为profilename 的shell 变量(将您的shell 变量设为小写字母,这总是由专家建议的),将其传递给awk 的变量profileName。然后使用awkmatch 函数在此处匹配visible-name='gh_dark,如果找到则将找到的变量设置为此处。 ASAP found 被设置然后打印这些行。现在在哪里停止 printint 一旦找到以[:(您显示的示例的第一行)开头的行然后找到未设置的行。

    【讨论】:

      【解决方案3】:

      据我所知,mawk 是 posix 兼容的,这意味着您可以将记录分隔符设置为空白。这样做时,它会将您的输入拆分为由一个或多个空行分隔的记录。这样您就可以快速提取感兴趣的配置文件。

      例如。

      awk 'BEGIN{RS=; ORS="\n\n"}
           /c812de27-9bc9-414b-a263-4995c1ec775a/
           /b1dcc9dd-5262-4d8d-a863-c897e6d979b9/
          ' input_file
      

      这将打印两个配置文件的配置。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-13
        • 1970-01-01
        • 2021-04-27
        相关资源
        最近更新 更多