【问题标题】:Extract the string between Quotes of particular occurrence in unix提取unix中特定出现的引号之间的字符串
【发布时间】:2012-04-30 01:18:44
【问题描述】:

输入文件

..
set name "old name"; # comment "should be updated"
..

输出文件

..
set name "new name" ; #comment "should be updated"
..

当我尝试使用 grep -i 'name' inputfile | grep -P \".+{\"} grep 引号之间的内容时,它在第一个“和最后一个”之间的 grep 内容

old name"; # comment "should be updated

使用grepsedawk 来实现这一点的任何想法!

【问题讨论】:

    标签: regex unix sed awk grep


    【解决方案1】:

    目前还不清楚您到底想做什么。一方面,您的 grep 命令包含一个花括号,而输入没有。此外,您似乎希望根据输入和输出的比较进行替换。

    但是,从字面上理解您的问题,以下是您如何grep 引号之间的字符串。您可以使用非贪婪匹配:

    grep -Po '".*?"'
    

    例子:

    $ echo 'set name "username"; # comment "should be updated"' | grep -Po '".*?"'
    "username"
    "should be updated"
    

    编辑:

    为了替换一个值,您可以使用sed。你不会使用grep

    sed 's/"[^"]*"/"new name"/'
    

    例子:

    $ echo 'set name "old name"; # comment "should be updated"' | sed 's/"[^"]*"/"new name"/'
    set name "new name"; # comment "should be updated"
    

    【讨论】:

    • 谢谢,它有帮助,现在更新了我的问题,希望现在很清楚,如果我们将 grep 的输出通过管道传输到 sed/awk,我们可以使用什么变量来访问它!这样我们就可以用其他字符串替换 grep 的输出并写回
    • @user1228191,注意用于实现非贪婪匹配的技术:一个引号,然后是尽可能多的非引号字符,然后是另一个引号 ("[^"]*")
    【解决方案2】:

    Sed:

    sed 's/[^"]*"\([^"]*\)".*/\1/'
    

    Awk:

    awk -F'"' '{ print $2 }'
    

    【讨论】:

    • 非常感谢,我们可以重定向 grepped 输出以进行替换吗,对不起,我是新手,只是学习一些东西!
    • 我的意思是,如果我们将 grep 的输出通过管道传输到 sed/awk,我们可以通过什么变量访问它!
    【解决方案3】:

    我假设should be 之后的单词应该是新用户名

    sed 's/^\([^"]\+"\)[^"]\+\(.*should be \)\([^"]\+\)/\1\3\2\3/' 
    

    使用 GNU sed 更整洁

    sed -r 's/^([^"]+")[^"]+(.*should be )([^"]+)/\1\3\2\3/'
    

    编辑 - 丹尼斯有一个很好的答案。如果新名称保存在 shell 变量中,您可以使用引用技巧:

    new_name="Fred"
    sed 's/"[^"]*/"'"$new_name"'"/'
    

    【讨论】:

    • 对不起,是我的错,我不是这个意思..新用户名可以是任何东西..感谢您的回答
    • 如果我们将 grep 的输出通过管道传输到 sed/awk,我们可以通过什么变量访问它!
    • 您可以使用双引号代替外部集合:sed "s/\"[^\"]*\"/\"$new_name\"/"。但是,在替换毛茸茸的引用时,您会留下很多毛茸茸的转义,并且您必须小心转义 $ 的某些实例。您可以对支持它的sed 版本使用八进制转义符(\o42 - 字母“o”信不信由你),但在这种情况下,我认为这不会更好。顺便说一句,您在第二个斜杠之前缺少双引号。
    猜你喜欢
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 2016-03-20
    • 2020-03-18
    相关资源
    最近更新 更多