用bs的结果替换bash中2个字符串之间的文本

时间:2015-03-31 09:50:43

标签: bash awk

我想为部署创建自动化,js / css是使用前缀生成的,我想将它们导入到标记之间的php文件中

预期输出

...
/*bashStart*/
drupal_add_css(drupal_get_path("module","myModule")."/styles/c91c6d11.main.css");
drupal_add_js(drupal_get_path("module","myModule")."/scripts/j91c6d11.main.js");
/*bashEnd*/
...

到目前为止,我使用了awk并把我带到了这里,但我遇到了问题,它已经生成了

    ...
    /*bashStart*/
    drupal_add_css(drupal_get_path("module","myModule")."/styles/c91c6d11.main.css
");
    drupal_add_js(drupal_get_path("module","myModule")."/scripts/j91c6d11.main.js
");
    /*bashEnd*/
    ...

这是awk脚本:

awk 'BEGIN {p=1}/Start/{print;printf("drupal_add_css(drupal_get_path(\"module\",\"myModule\").\"/styles/");system("ls styles");printf("\");\n");printf("drupal_add_js(drupal_get_path(\"module\",\"myModule\").\"/scripts/");system("ls scripts");printf("\");\n");p=0}/Finish/{p=1} p' myModule.module > tmp;

1 个答案:

答案 0 :(得分:1)

在awk中使用ls不是很好 - 我认为你可以完全在shell中执行此操作:

#!/bin/bash

p=1
while read -r line; do
    [[ $line = '/*bashEnd*/' ]] && p=1
    (( p )) && echo "$line"
    if [[ $line = '/*bashStart*/' ]]; then
        p=0
        for style in styles/*; do
            echo 'drupal_add_css(drupal_get_path("module","myModule")."/styles/'"$style"'");'
        done
        for script in scripts/*; do
            echo 'drupal_add_js(drupal_get_path("module","myModule")."/scripts/'"$script"'");'
        done
    fi
done < file.php > output.php

循环输入文件,直到到达“bashStart”行,然后添加所需的行。输出转到文件output.php,您可以在覆盖原始文件之前检查该文件。如果您有信心可以将&& mv output.php file.php添加到done行,则覆盖原始文件。

标志p控制打印哪条线。当达到“bashStart”行时设置为0,当达到bashEnd行时设置为1,因此两者之间的行被替换。