【问题标题】:Shell Script get text between 2 special charactersShell脚本获取2个特殊字符之间的文本
【发布时间】:2015-05-14 03:22:26
【问题描述】:

我已经阅读了一些内容,但似乎无法解决这个特定问题。我正在编写一个 shell 脚本。我正在使用

将文件读取到变量中
LOCAL_CONFIG=`cat local-config.php`

有这样的行

define( 'DB_USER', 'abcxyz' );
define( 'DB_PASSWORD', 'qwerty' );

我怎样才能得到这个的 abcxyz 和 qwerty 部分??

提前致谢

【问题讨论】:

  • 尽量避免使用旧的和不推荐使用的反引号,使用这样的括号:LOCAL_CONFIG=$(cat local-config.php)

标签: string shell grep substring


【解决方案1】:

“cut”命令将以更简单的方式执行...

命令:

cat local-config.php | cut -d "'" -f4

输出:

abcxyz
qwerty

说明:

使用 cut 和 ' 作为分隔符,我们需要在行中取第四部分(f4)。

【讨论】:

    【解决方案2】:

    使用 awk

    $ awk -F"'" '/^define\(/ {print $4}' local-config.php
    abcxyz
    qwerty
    

    解释:

    • -F"'"

      这将字段分隔符定义为单引号。

    • /^define\(/

      这会选择以define(开头的行

    • print $4

      对于那些选定的行,这将打印第四个字段。

    使用 sed

    $ sed -rn "/^define\(/ {s/([^']*'){3}//; s/'.*//; p;}" local-config.php
    abcxyz
    qwerty
    
    • -rn

      这会打开扩展的正则表达式语法并关闭自动打印。

    • /^define\(/

      这会选择以define(开头的行

    • {

      这将启动一个组。该组中的命令仅对选定的行执行。

    • s/([^']*'){3}//

      这会删除所有文本,包括第三个引号。

    • s/'.*//

      这将删除下一个剩余引号之后的所有文本。

    • p

      这会打印该行。

    • }

      小组结束。

    【讨论】:

      【解决方案3】:

      使用 grep 和 -P 参数来启用 perl-regexp 模式。

      $ grep -oP "\bdefine\( *'[^']*' *,  *'\K[^']*(?=' *\);)" file
      abcxyz
      qwerty
      

      \K 在最后打印时丢弃先前匹配的字符。

      【讨论】:

      • 如有必要,请使用\s* 而不是空格*。
      • 非常感谢!另外,如果我特别想得到一个,我会在哪里说“DB_USER 部分?”
      • DB_USER替换第一个否定的char类,比如grep -oP "\bdefine\( *'DB_USER' *, *'\K[^']*(?=' *\);)" fILE
      • 冠军!有一天我必须了解这一切是如何运作的,谢谢
      猜你喜欢
      • 1970-01-01
      • 2021-01-12
      • 2021-01-27
      • 2016-02-12
      • 2015-06-23
      • 2018-05-03
      • 2019-01-28
      • 1970-01-01
      • 2021-03-06
      相关资源
      最近更新 更多