【问题标题】:Get substring from file using "sed"使用“sed”从文件中获取子字符串
【发布时间】:2012-02-09 11:42:50
【问题描述】:

谁能帮我使用sed 程序获取子字符串?

我有一个包含这一行的文件:

....
define("BASE", "empty"); # there can be any string (not only "empty").
....

我需要将“空”作为我的 bash 脚本的字符串变量。

此时我有:

sed -n '/define(\"BASE\"/p' path/to/file.ext
# returns this line:
# define("BASE", "empty");
# but I need 'empty'

UPD:感谢@Jaypal

现在我有 bash 脚本:

DBNAME=`sed -n '/define(\"BASE\"/p' path/to/file.ext`
echo $DBNAME | sed -r 's/.*"([a-zA-Z]+)".*/\1/'

它工作正常,但是否有任何方法可以用一行代码进行相同的操作?

【问题讨论】:

    标签: bash sed substring


    【解决方案1】:

    你应该使用 is

    sed -n 's/.*\".*\", \"\(.*\)\".*/\1/p' yourFile.txt
    

    表示某事 (.*),后跟引号中的某事 (\".*\"),然后是逗号和空格 (,),然后是引号中的某事 (\"\(.*\)\")。

    括号定义了您以后可以重用的部分,即第二个引号内的字符串。与\1一起使用。

    我把-n放在前面是为了回答更新的问题,让被操纵的线路上线。

    【讨论】:

    • @Jeypal:抱歉,无法回答您的问题。你忘了照顾第一个报价。据我所知,如果 "empty" 不在您放入搜索的括号旁边,您的代码会找到第一个字符串。
    • 非常感谢!这就是我需要的。
    【解决方案2】:

    这应该会有所帮助 -

    sed -r 's/.*"([a-zA-Z]+)"\);/\1/' path/to/file.ext
    

    如果您可以使用awk,那么您可以尝试以下方法 -

    awk -F\" '/define\(/{print $(NF-1)}' path/to/file.ext
    

    更新:

    DBNAME=$(sed -r '/define\(\"BASE\"/s/.*"([a-zA-Z]+)"\);/\1/' path/to/file.ext)
    

    【讨论】:

    • 抱歉问题不干净,但我的意思是获取此定义中的值(可以有任何字符串,不仅是“空”)。
    • 更新了答案。 DBNAME 变量现在将具有您想要的字符串。 :)
    • 更新的正则表达式返回 'sed: -e ... Unmatched ( or (' 我是 bash 的新手,你能帮我解决这个错误吗?
    • 对不起亚瑟,我的错。忘记转义(。请尝试使用新的。
    【解决方案3】:
     sed -nr '/^define.*"(.*)".*$/{s//\1/;p}' path/to/file.ext
    

    【讨论】:

    • 感谢您的回答。但我更喜欢@ezdazuzena 的回答。他给出了更多的描述,实际上它在我需要的时候起作用了。
    【解决方案4】:

    如果您的文件不随时间变化(即行号将始终相同),您可以使用该行,并使用分隔符将您的部分取出:

    `sed -n 'Xp' your.file  | cut -d ' ' -f 2 |cut -d "\"" -f 2`
    

    假设 X 是您所需行的行号

    【讨论】:

      猜你喜欢
      • 2017-01-31
      • 2019-08-11
      • 2015-08-06
      • 1970-01-01
      • 2012-04-09
      • 1970-01-01
      • 2012-07-01
      • 2016-05-22
      • 2022-01-08
      相关资源
      最近更新 更多