匹配模式后插入一行
Inserting a row after matching a pattern
我正在尝试弄清楚如何更新条目数量不确定的配置文件(文本文件)。我在 RHEL 7 环境中使用 Linux 工具。
问题是,我需要在文件中找到一个特定的模式,并插入一行新数据。这部分很简单。变得复杂的地方(对我来说)是我需要保留 table 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>。所以上面看起来像:
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"
其他信息:
- tables (MY_TABLES_X) 的数量可以在单个文件中从 1 到几百不等
- 用户有一个接口可以用来添加新值;因此该软件将处理创建或编辑新文件。我需要做的是提供对现有文件的更新;但最好确保新的 "USER_CODE" 还没有出现在特定的 MY_TABLE_X 条目中。
感谢任何帮助!
KSL.
想法是捕获组并用 newline
个字符替换。
正则表达式: (MY_TABLE_\d+)(\s*)(CODE_TYPE.*)
上面的正则表达式找到了你想要的行,你希望在该行之后添加一个新行,并在组中捕获要替换的部分,例如 MY_TABLE_X
后跟 whitespaces
。
替换:替换为\nUSER_CODE "DEFAULT"
替换如下。
MY_TABLE_1 USER_CODE "DEFAULT"
MY_TABLE_1 CODE_STATE "ON"
使用 awk:
awk '{print [=10=]}~/CODE_TYPE/{printf "%s\n", " USER_CODE \"DEFAULT\""}' inFile > outFile
这里是awk
- 打印出行
{print [=11=]}
- 测试该行是否在第二个字段中包含单词 "CODE_TYPE"
~/CODE_TYPE/
- 如果是这样,它会在第一个字段
中打印出 table 并且您的默认内容由许多空格分隔,然后是回车符 return.
尝试:
awk '/CODE_TYPE/{A=;print [=10=] ORS " USER_CODE 2DEFAULT2";next} 1' Input_file
查找字符串 CODE_TYPE 然后打印当前行,然后打印 ORS(输出字段分隔符)然后 $1 即该部分的 TABLE_X 值,然后此处新添加的行 \042 定义了" 将被打印。提及 next 关键字将跳过所有接下来的语句。1 将打印除具有字符串 CODE_TYPE 的行之外的所有行,该行已经被打印,因此它不会被 1 打印。
$ awk '1;sub(/CODE_TYPE.*/,"USER_CODE \"DEFAULT\"")' file
MY_TABLE_1 MY_CODE "OFF"
MY_TABLE_1 YOUR_CODE "ON"
MY_TABLE_1 CODE_TYPE "<NONE>"
MY_TABLE_1 USER_CODE "DEFAULT"
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"
MY_TABLE_2 CODE_STATE "ON"
上面保留了上一行的前导白色 space 以用于新行,因此您不需要 specify/hard-code 它。
这可能对你有用 (GNU sed):
sed '/CODE_TYPE.*/p;s//USER_CODE "DEFAULT"/' file
在字符串匹配时,打印当前行,然后替换并照常打印。
我正在尝试弄清楚如何更新条目数量不确定的配置文件(文本文件)。我在 RHEL 7 环境中使用 Linux 工具。 问题是,我需要在文件中找到一个特定的模式,并插入一行新数据。这部分很简单。变得复杂的地方(对我来说)是我需要保留 table 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>。所以上面看起来像:
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"
其他信息: - tables (MY_TABLES_X) 的数量可以在单个文件中从 1 到几百不等 - 用户有一个接口可以用来添加新值;因此该软件将处理创建或编辑新文件。我需要做的是提供对现有文件的更新;但最好确保新的 "USER_CODE" 还没有出现在特定的 MY_TABLE_X 条目中。
感谢任何帮助!
KSL.
想法是捕获组并用 newline
个字符替换。
正则表达式: (MY_TABLE_\d+)(\s*)(CODE_TYPE.*)
上面的正则表达式找到了你想要的行,你希望在该行之后添加一个新行,并在组中捕获要替换的部分,例如 MY_TABLE_X
后跟 whitespaces
。
替换:替换为\nUSER_CODE "DEFAULT"
替换如下。
MY_TABLE_1 USER_CODE "DEFAULT"
MY_TABLE_1 CODE_STATE "ON"
使用 awk:
awk '{print [=10=]}~/CODE_TYPE/{printf "%s\n", " USER_CODE \"DEFAULT\""}' inFile > outFile
这里是awk
- 打印出行
{print [=11=]}
- 测试该行是否在第二个字段中包含单词 "CODE_TYPE"
~/CODE_TYPE/
- 如果是这样,它会在第一个字段
中打印出 table 并且您的默认内容由许多空格分隔,然后是回车符 return.
尝试:
awk '/CODE_TYPE/{A=;print [=10=] ORS " USER_CODE 2DEFAULT2";next} 1' Input_file
查找字符串 CODE_TYPE 然后打印当前行,然后打印 ORS(输出字段分隔符)然后 $1 即该部分的 TABLE_X 值,然后此处新添加的行 \042 定义了" 将被打印。提及 next 关键字将跳过所有接下来的语句。1 将打印除具有字符串 CODE_TYPE 的行之外的所有行,该行已经被打印,因此它不会被 1 打印。
$ awk '1;sub(/CODE_TYPE.*/,"USER_CODE \"DEFAULT\"")' file
MY_TABLE_1 MY_CODE "OFF"
MY_TABLE_1 YOUR_CODE "ON"
MY_TABLE_1 CODE_TYPE "<NONE>"
MY_TABLE_1 USER_CODE "DEFAULT"
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"
MY_TABLE_2 CODE_STATE "ON"
上面保留了上一行的前导白色 space 以用于新行,因此您不需要 specify/hard-code 它。
这可能对你有用 (GNU sed):
sed '/CODE_TYPE.*/p;s//USER_CODE "DEFAULT"/' file
在字符串匹配时,打印当前行,然后替换并照常打印。