我试图弄清楚如何更新具有无限数量条目的配置文件(文本文件)。我在使用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。
答案 0 :(得分:2)
使用awk:
awk '{print $0}$2~/CODE_TYPE/{printf "%s\n", $1" USER_CODE \"DEFAULT\""}' inFile > outFile
这里awk
{print $0}
$2~/CODE_TYPE/
$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
在字符串匹配时,打印当前行,然后替换并正常打印。