匹配模式后插入一行

时间:2017-05-10 18:44:49

标签: regex bash awk sed csh

我试图弄清楚如何更新具有无限数量条目的配置文件(文本文件)。我在使用Linux工具的RHEL 7环境中。  问题是,我需要在文件中找到一个特定的模式,并插入一行新的数据。这部分很简单。它变得复杂(对我而言)是我需要保留表id并将其与其余数据一起插入。例如:

我目前的数据(遗憾的是必然是名义上的):

 MY_TABLE_1     MY_CODE "OFF"
 MY_TABLE_1     YOUR_CODE "ON"
 MY_TABLE_1     CODE_TYPE "<NONE>"
 MY_TABLE_1     CODE_STATE "ON"
 MY_TABLE_2     MY_CODE "IGNORE"
 MY_TABLE_2     YOUR_CODE "IGNORE"
 MY_TABLE_2     CODE_TYPE "FLAGGED"
 MY_TABLE_2     CODE_STATE "ON"

我需要做的是找到条目CODE_TYPE并在其后插入一个新条目,但是我需要为该条目保留MY_TABLE_X&gt;。所以上面看起来像:

 MY_TABLE_1     MY_CODE "OFF"
 MY_TABLE_1     YOUR_CODE "ON"
 MY_TABLE_1     CODE_TYPE "<NONE>"
 MY_TABLE_1     USER_CODE "DEFAULT"  <-- Added Row
 MY_TABLE_1     CODE_STATE "ON"
 MY_TABLE_2     MY_CODE "IGNORE"
 MY_TABLE_2     YOUR_CODE "IGNORE"
 MY_TABLE_2     CODE_TYPE "FLAGGED"
 MY_TABLE_2     USER_CODE "DEFAULT"  <-- Added Row
 MY_TABLE_2     CODE_STATE "ON"

其他信息: - 单个文件中的表数(MY_TABLES_X)可以是1到几百个 - 用户有一个用于添加新值的界面;因此软件将处理创建或编辑新文件。我需要做的是提供现有文件的更新;但是要确保新的&#34; USER_CODE&#34;尚未出现特定的MY_TABLE_X条目。

感谢您的任何帮助!

KSL。

5 个答案:

答案 0 :(得分:2)

使用awk:

awk '{print $0}$2~/CODE_TYPE/{printf "%s\n", $1"     USER_CODE \"DEFAULT\""}' inFile > outFile

这里awk

  1. 打印出行{print $0}
  2. 测试该行是否在第二个字段$2~/CODE_TYPE/
  3. 中包含单词“CODE_TYPE”
  4. 如果是这样,它会打印出第一个字段$1中的表格,并将您的默认内容分隔为这么多空格,然后回车。

答案 1 :(得分:1)

我们的想法是捕获群组并替换为newline个字符。

正则表达式: (MY_TABLE_\d+)(\s*)(CODE_TYPE.*)

在正则表达式上方找到您想要添加新行的所需行,并在组中捕获要替换的部分,例如MY_TABLE_X后跟whitespaces

替换:使用\1\2\3\n\1\2USER_CODE "DEFAULT"

重新搜索

替换如下。

MY_TABLE_1     USER_CODE "DEFAULT"
MY_TABLE_1     CODE_STATE "ON"

<强> Regex101 Demo

答案 2 :(得分:1)

尝试:

awk '/CODE_TYPE/{A=$1;print $0 ORS $1 "     USER_CODE \042DEFAULT\042";next} 1'    Input_file

查找字符串CODE_TYPE然后打印当前行然后是ORS(输出字段分隔符)然后是$ 1,这是该部分的TABLE_X值,然后新添加的行\ 042定义“要打印。提到下一个关键字将然后跳过所有下一个语句.1将打印除已经打印的字符串CODE_TYPE的行以外的所有行,因此不会打印1。

答案 3 :(得分:1)

$Total_Sales = array();  // define array here
foreach ($reps as $rep){
    $q="SELECT sales_quantity.style_num, sales_quantity.number_sold, sales_reps.fname, sales_reps.lname FROM catalog JOIN sales_quantity ON catalog.style_num = sales_quantity.style_num
        JOIN sales_reps ON sales_quantity.sales_rep_login = sales_reps.sales_rep_login
        WHERE catalog.status = 'A'
        AND catalog.season_id = '" . $_POST['season'] . "'
        AND sales_quantity.sales_rep_login = '" .$rep. "'
        AND sales_reps.status = 'A'
        ORDER BY sales_quantity.number_sold DESC LIMIT 10";
        $return_sales = mysql_query($q);

        while($Sales=mysql_fetch_assoc($return_sales)) 
        $Total_Sales[$rep][] = $Sales; // make 2 dimensional array
        }

上面保留了前一行中的前导空格,以便在新行中使用,因此无需指定/硬编码。

答案 4 :(得分:1)

这可能适合你(GNU sed):

sed '/CODE_TYPE.*/p;s//USER_CODE "DEFAULT"/' file

在字符串匹配时,打印当前行,然后替换并正常打印。