如何使用bash复制文件中的行

时间:2014-06-04 10:56:03

标签: bash sed

我正在使用bash创建新文件,我需要为此文件添加导入指令:

// main.less
// @import "TOKEN.less";
@import "module_a.less";
@import "module_b.less";
// ...

// main.js
define(function(require) {
  // require('TOKEN.js');
  require('module_a.js');
  require('module_b.js');
  // ...
});

我需要编辑此文件以添加新的@importrequire指令。我正在尝试复制TOKEN行,并用新模块名称替换TOKEN

我开始使用sed替换令牌,但我找不到复制该行的方法。

现在我使用node -e来执行节点脚本而不是读取文件,迭代行并复制我需要的那些,但这很乱,也许bash有一个简单的方法来执行此操作。

更新

预期的行为是,如果我执行

my_script.sh module_user

它将编辑这些文件,使它们最终像这样

// main.less
// @import "TOKEN.less";
@import "module_user.less";
@import "module_a.less";
@import "module_b.less";
// ...

// main.js
define(function(require) {
  // require('TOKEN.js');
  require('module_user.js');
  require('module_a.js');
  require('module_b.js');
  // ...
});

我真的不关心@import / require

的顺序

2 个答案:

答案 0 :(得分:2)

我已经为你写了一个小脚本,可以解决这个问题:

#!/bin/bash

# first param = file name
# second param = modul name

if [ "$#" -ne 2 ]; then
    echo "2 parameters required: file name and module name"
    exit    
fi

_LINE=$(grep 'TOKEN' $1)
_UNCOMMENTED_LINE=$(echo $_LINE | sed 's/\/\///g')
_REPLACED_LINE=$(echo $_UNCOMMENTED_LINE | sed -e "s/TOKEN/$2/g")

sed -i "s#$_LINE#$_LINE\n$_REPLACED_LINE#" $1

编辑: 根据您的第一个示例,替换的内容将是:

// main.less
// @import "TOKEN.less";
@import "test2.less";
@import "module_a.less";
@import "module_b.less";
// ...

其中 test2 是模块名称。

答案 1 :(得分:1)

以下sed命令似乎在mac上运行正常。然后,您可以使用Jacek Sokolowski执行的其余脚本来检查参数等。

# the newlines are important
sed -i"" '/TOKEN/a\ 
@import "module_user.less"; 
' main.less