将正则表达式替换分配给bash中变量的正确方法

时间:2019-04-26 09:02:21

标签: bash perl

我正在尝试为bash中的正则表达式替换结果分配一个变量。例如,当我跑步

@Configuration @EnableWebSecurity public class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Autowired private FilterChainExceptionHandler filterChainExceptionHandler; @Override protected void configure(HttpSecurity http) throws Exception { http .addFilterBefore(filterChainExceptionHandler, LogoutFilter.class) (...) } }

我从echo $initialvar | perl -pe 's/.+(Some_Dir\/)(.+)/\2/'获得了期望的输出。如何将echo分配给结果输出?

我尝试过:

newvar

但它们都不起作用

2 个答案:

答案 0 :(得分:2)

您可以使用以下任一选项:

newvar=$(echo "$initialvar" | perl -pe 's/.+(Some_Dir\/)(.+)/\2/')
newvar=`echo "$initialvar" | perl -pe 's/.+(Some_Dir\/)(.+)/\2/'`

答案 1 :(得分:2)

对于您的问题,这似乎包含两个挑战:一个是将运行命令的输出分配给BASH变量,另一个是将变量的内容传递给Perl程序的标准输入。 / p>

一个

foo=$(bar)

运行bar并将其输出保存到BASH变量$foo

The other

任何

echo "$foo" | bar
bar <(echo "$foo")
bar <<< "$foo"

运行bar,将$foo的内容通过管道传输到其标准输入

两者结合

baz=$(bar <<< "$foo")

$baz设置为bar产生的值,并将$foo的内容发送到其标准输入。


其次,一些与Perl相关的建议与您的问题相关:

我可以改用perl -nE

  • -n会像-p那样遍历每一行,但默认情况下不会打印。
  • -E的评估结果类似于-e,但启用了诸如say这样的实验性功能。

您可以使用其他分隔符来避免在Some_Dir/中转义斜线。 s!...!...!m!...!。不用用s//代替,因为您只打印“ Some_Dir /”(如果它匹配),那么您最好直接去做:

perl -nE 'say (m!Some_Dir/! ? "Some_Dir/" : $_)'

所以:

newvar=$(perl -nE 'say (m!Some_Dir/! ? "Some_Dir/" : $_)' <<< "$initialvar")