awk,如果记录包含值则为条件

时间:2020-05-30 23:47:21

标签: macos if-statement awk zsh contains

当记录包含值时,我很难获得awk if / else条件,以正确触发。在Mac OS Catalina上的zsh中运行此程序。

此脚本(问题在倒数第二行)...

echo "abcdefgh" >  ./temp
echo "abc\"\(\"h" >> ./temp
echo "abcdefgh" >> ./temp
echo "abcde\(h" >> ./temp 

val='"\("'
key="NEW_NEW"
file="./temp"

echo $val
echo $key
echo $file

echo ""
echo "###############"
echo ""

awk '
    BEGIN { old=ARGV[1]; new=ARGV[2]; ARGV[1]=ARGV[2]=""; len=length(old) }
    ($0 ~ /old/){ s=index($0,old); print substr($0,1,s-1) new substr($0,s+len) }{ print $0 }
' $val $key $file

输出:

"\("
NEW_NEW
./temp

###############

abcdefgh
abc"\("h
abcdefgh
abcde\(h

我想修复脚本,以便将"\("更改为NEW_NEW,但是跳过不带引号的括号...

"\("
NEW_NEW
./temp

###############

abcdefgh
abcNEW_NEWh
abcdefgh
abcde\(h

编辑

这是我正在处理的真实脚本的缩写版本。答案将需要包括上面的示例所具有的变量扩展,以便我在较大的脚本中使用该命令。使用的ARGV格式保留了特殊字符,因此,我遇到的主要问题是为什么条件未按预期触发。

2 个答案:

答案 0 :(得分:1)

此代码使用变量@Configuration @EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler( "/webjars/**", "/img/**", "/css/**", "/js/**") .addResourceLocations( "classpath:/META-INF/resources/webjars/", "classpath:/static/img/", "classpath:/static/css/", "classpath:/static/js/"); } @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable(); http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.ALWAYS); http.authorizeRequests().antMatchers(HttpMethod.GET, "/js/**", "/css/**", "/img/**" ,"/pressiplus", "/public/**", "/index", "/", "/login").permitAll(); http.authorizeRequests() .antMatchers("/secure/admin/**").hasAnyRole("ADMIN","USER") .antMatchers("/secure/admin/**").hasAnyRole("ADMIN") .and() .formLogin() //login configuration .loginPage("/login") .failureUrl("/login-error") .loginProcessingUrl("/login") .usernameParameter("email") .passwordParameter("password") .successHandler(myAuthenticationSuccessHandler()) .and() .logout() //logout configuration .logoutUrl("/logout") .logoutSuccessHandler(myLogoutSuccessHandler) .and() .rememberMe() .tokenRepository(persistentTokenRepository()) .tokenValiditySeconds(7 * 24 * 60 * 60) // expires in 7 days .and() .exceptionHandling() //exception handling configuration .accessDeniedHandler(accessDeniedHandler()); } } valkey,但假定您可以更改file的内容,以补偿传递给{{ 1}}

val

答案 1 :(得分:1)

($0 ~ /old/)的意思是“在当前记录($0)和文字正则表达式old之间进行正则表达式比较”,因此当$ 0包含3个字符o时,它会匹配, ld的顺序。您可能正在尝试对名为old的变量$0 ~ old(请参阅How do I use shell variables in an awk script?)的内容进行正则表达式比较,但实际上并不需要它,而是想要一个字符串比较将是上一个问题(https://stackoverflow.com/a/62096075/1745001中显示的index($0,old),但是由于某种原因您现在已经将其移出了condition { action } awk语句的条件部分,并将其作为而是采取行动的第一部分。所以不要那样。

脚本的另一个主要问题是您要删除外壳变量周围的引号,以使它们被外壳解释并经过遍历,扩展文件名等操作,甚至在awk看到它们之前(请参阅https://mywiki.wooledge.org/Quotes)。所以也不要这样做。

仅修复我提到的部分:

$ cat tst.sh
echo "abcdefgh" >  ./temp
echo "abc\"\(\"h" >> ./temp
echo "abcdefgh" >> ./temp
echo "abcde\(h" >> ./temp

val='"\("'
key="NEW_NEW"
file="./temp"

echo "$val"
echo "$key"
echo "$file"

echo ""
echo "###############"
echo ""

awk '
    BEGIN { old=ARGV[1]; new=ARGV[2]; ARGV[1]=ARGV[2]=""; len=length(old) }
    s=index($0,old) { $0 = substr($0,1,s-1) new substr($0,s+len) }
    { print }
' "$val" "$key" "$file"

$ ./tst.sh
"\("
NEW_NEW
./temp

###############

abcdefgh
abcNEW_NEWh
abcdefgh
abcde\(h
相关问题