shell 使用sed查找和替换复杂正则表达式行

gopyfrb3  于 2023-03-19  发布在  Shell
关注(0)|答案(2)|浏览(153)

我正在使用环境变量,只想找到包含环境变量的行,并将其替换为由特殊字符组成的整行。
详细信息:project_path="abc/test-roadie"
简而言之,我试图在包含$project_path的文件中找到一行,一旦找到,就用下面的行替换整行:

app('projects/$project_path', [hello.dev, hello.stage, hello.prod]),

(请注意结尾的逗号)
我尝试的命令:

sed -i '/'$project_path'.*/c app('"'projects/$project_path'"'," [hello.dev, hello.stage, hello.prod]),' file_name

sed:1:“文件”:无效命令代码f
请注意我想替换整行。问题出在我要替换的复杂字符串上,它由括号,逗号,斜杠组成。它没有被替换。

gt0wga4j

gt0wga4j1#

不要尝试使用sed,因为它不理解文本字符串(参见is-it-possible-to-escape-regex-metacharacters-reliably-with-sed),使用awk代替:

awk -v old="$project_path" \
    -v new="app('projects/$project_path', [hello.dev, hello.stage, hello.prod])," \
    'index($0,old){$0=new} 1' file

上面假设$project_path不包含转义,如果它可以看到how-do-i-use-shell-variables-in-an-awk-script作为-v的替代,并且您希望$project_path在搜索和替换字符串中都展开。

czfnxgou

czfnxgou2#

您可以用途:

sed -r "s:^.*[\$]project_path.*\$:app('projects/\$project_path', [hello.dev, hello.stage, hello.prod]),:g" file_name

此处:

  • :-sed的分隔符
  • ^.*[\$]project_path.*\$- regex搜索行
  • ^.*-从行首开始的所有内容
  • [\$]-ERE正则表达式中的美元符号
  • project_path-“变量”的名称
  • .*\$-行结束前的所有内容

另外,注意所有的$都用\转义,因为替换命令用双引号括起来了。我认为转义$比转义单引号更赏心悦目。

相关问题