Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在每对双引号之间插入字符串_Regex_Bash_Sed - Fatal编程技术网

Regex 在每对双引号之间插入字符串

Regex 在每对双引号之间插入字符串,regex,bash,sed,Regex,Bash,Sed,我陷入困境,我有如下所示的字符串: -name "B_12*" -o -name "B_21*" -o -name "B_31" -o -name "B_41" -name "B_12*.tar" -o -name "B_21*.tar" -o -name "B_31.tar" -o -name "B_41.tar" 我的要求是我想转换上面的字符串,如下所示: -name "B_12*" -o -name "B_21*" -o -name "B_31" -o -name "B_41" -n

我陷入困境,我有如下所示的字符串:

-name "B_12*" -o -name "B_21*" -o -name "B_31" -o -name "B_41"
-name "B_12*.tar" -o -name "B_21*.tar" -o -name "B_31.tar" -o -name "B_41.tar"
我的要求是我想转换上面的字符串,如下所示:

-name "B_12*" -o -name "B_21*" -o -name "B_31" -o -name "B_41"
-name "B_12*.tar" -o -name "B_21*.tar" -o -name "B_31.tar" -o -name "B_41.tar"

我不擅长bash命令,但我不知道这个问题可以用
sed
命令来解决。

此模式将匹配文本字符串而不使用单引号,您只需获得所有匹配项并执行另一个查询来添加
.tar

\b[A-Z][^"]+

  • \b[A-Z]
    匹配作用域[A-Z]中的字符
  • [^”]
    匹配到“

    演示


    • 这里唯一棘手的部分是,您需要匹配两个引号,以便它们不会再次匹配。对于具有ERE支持by-E选项的sed发行版,下面的命令就足够了

      sed -E 's/("[^"]*)"/\1.tar"/g' file
      

      您好,查询似乎总是在sed中完成的。很方便!我一直认为我必须进行查询(比如循环)。谢谢正则表达式末尾的
      g
      af告诉sed循环所有必须更改的事件。@Pierre正确。除了它不是正则表达式的一部分,而是sed脚本的标志部分;术语的误用常常导致错误confusion@oguzismail:当然,我的意思是在正则表达式之后,比在正则表达式末尾更好。您应该添加更多关于确切需要替换的内容的详细信息。它总是
      -命名为“B_XX*”
      还是其他什么?告诉我们您尝试了什么以及它遇到了什么问题。看起来您试图将参数列表(对于
      查找
      命令?)构造为字符串。这样做几乎总是错误的。通常的正确方法是使用数组而不是普通字符串(请参阅)。为了获得与regex101.com相同的结果,我认为您需要在sed命令中添加
      -E
      标志。即使使用-E,一些sed也无法识别
      \b
      您好,谢谢您的回答。。如果我只想搜索扩展名前有编号的文件,比如:B_12.csv、B_22.csv和B_22-UK.csv我想要正则表达式,它应该得到B_12.cvs和B_22.csv,并且应该包含B_22-UK.csv