Regex 在匹配模式后插入行

Regex 在匹配模式后插入行,regex,bash,awk,sed,csh,Regex,Bash,Awk,Sed,Csh,我试图弄清楚如何更新具有无限条目的配置文件(文本文件)。我在RHEL7环境中使用Linux工具。 问题是,我需要在文件中找到一个特定的模式,并插入一行新的数据。这部分很简单。(对我来说)复杂的地方在于我需要保留表id并将其与其余数据一起插入。例如: 我目前的数据(不幸的是,必须是概念性的): MY_TABLE_1 MY_code“关闭” 我的\u表\u 1您的\u代码“打开” 我的\u表\u 1代码\u类型“” 我的\u表\u 1代码\u状态“打开” 我的\u表\u 2我的\u代码“忽略” 我的

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

我目前的数据(不幸的是,必须是概念性的):

MY_TABLE_1 MY_code“关闭”
我的\u表\u 1您的\u代码“打开”
我的\u表\u 1代码\u类型“”
我的\u表\u 1代码\u状态“打开”
我的\u表\u 2我的\u代码“忽略”
我的\u表\u 2您的\u代码“忽略”
MY_TABLE_2代码_类型“已标记”
我的表2代码状态为“开”

我需要做的是找到条目代码类型并在其后面插入一个新条目,但我需要为该条目保留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"
MY_TABLE_1 MY_code“关闭”
我的\u表\u 1您的\u代码“打开”
我的\u表\u 1代码\u类型“”

MY_TABLE_1 USER_CODE“DEFAULT”这个想法是捕获组并用换行符替换

正则表达式:
(MY\u TABLE\ud+(\s*)(code\u TYPE.*)

上面的正则表达式找到您想要添加新行的行,并在组中捕获要替换的部分,例如
MY_TABLE\u X
,后跟
空格

替换:
\1\2\3\n\1\2用户代码“默认值”替换

其替换如下

MY_TABLE_1     USER_CODE "DEFAULT"
MY_TABLE_1     CODE_STATE "ON"

这个想法是捕获组,并用
换行符替换

正则表达式:
(MY\u TABLE\ud+(\s*)(code\u TYPE.*)

上面的正则表达式找到您想要添加新行的行,并在组中捕获要替换的部分,例如
MY_TABLE\u X
,后跟
空格

替换:
\1\2\3\n\1\2用户代码“默认值”替换

其替换如下

MY_TABLE_1     USER_CODE "DEFAULT"
MY_TABLE_1     CODE_STATE "ON"

带awk:

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

  • 打印出行
    {print$0}
  • 测试第二个字段$2~/CODE\u TYPE/
  • 如果是这样的话,它会打印出第一个字段
    $1
    中的表格,以及用这么多空格分隔的默认内容,然后是回车
  • 使用awk:

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

  • 打印出行
    {print$0}
  • 测试第二个字段$2~/CODE\u TYPE/
  • 如果是这样的话,它会打印出第一个字段
    $1
    中的表格,以及用这么多空格分隔的默认内容,然后是回车
  • 尝试:

    查找字符串代码\u TYPE,然后打印当前行,然后是ORS(输出字段分隔符),然后是$1,它是该节的表\u X值,然后是此处新添加的行\042定义“待打印。提到next关键字将跳过所有next语句。1将打印所有行,但已打印字符串代码类型的行除外,因此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"
    
    查找字符串代码\u TYPE,然后打印当前行,然后是ORS(输出字段分隔符),然后是$1,它是该节的表\u X值,然后是此处新添加的行\042定义“待打印。提到next关键字将跳过所有next语句。1将打印所有行,但已打印字符串代码类型的行除外,因此1不会打印该行。

    $awk'1;子(/CODE\u TYPE.*/,“USER\u CODE\“DEFAULT\”)文件
    $ 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"
    
    我的\u表\u 1我的\u代码“关闭” 我的\u表\u 1您的\u代码“打开” 我的\u表\u 1代码\u类型“” 我的表格用户代码“默认” 我的\u表\u 1代码\u状态“打开” 我的\u表\u 2我的\u代码“忽略” 我的\u表\u 2您的\u代码“忽略” MY_TABLE_2代码_类型“已标记” 我的\u表\u 2用户\u代码“默认” 我的表2代码状态为“开”
    以上内容保留了前一行的前导空格,以便在新行中使用,因此无需指定/硬编码。

    $awk'1;子(/CODE\u TYPE.*/,“USER\u CODE\“DEFAULT\”)文件
    我的\u表\u 1我的\u代码“关闭”
    我的\u表\u 1您的\u代码“打开”
    我的\u表\u 1代码\u类型“”
    我的表格用户代码“默认”
    我的\u表\u 1代码\u状态“打开”
    我的\u表\u 2我的\u代码“忽略”
    我的\u表\u 2您的\u代码“忽略”
    MY_TABLE_2代码_类型“已标记”
    我的\u表\u 2用户\u代码“默认”
    我的表2代码状态为“开”
    
    以上内容保留了前一行的前导空格,以便在新行中使用,因此无需指定/硬编码。

    这可能适合您(GNU-sed):

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

    这可能适用于您(GNU-sed):


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

    为什么将添加的第一行放在代码类型行之后一行,而不是紧跟其后?对于相同的X,“我的表格”行是否总是连续?捕捉正确,复制/粘贴错误。刚刚编辑。是的,对于相同的X始终是连续的。谢谢。为什么您将添加的第一行放在代码类型行之后一行,而不是紧跟在代码类型行之后?对于相同的X,我的表格行是否始终是连续的?捕获正确,复制/粘贴错误。刚刚编辑。是的,同一个X始终是连续的。谢谢。这工作很好,除了它抱怨双“;一旦我取出其中一个,它就完全满足了我的需要…即使有所有的空间!!:)。谢谢你的解释!好的,仔细看,它确实需要第二个引号,否则它不会在字符串上加上结束引号!但是,当我添加它时,在第二个引号中出现了错误“unterminated string”。好吧,我错了!我错过了第一个双引号的转义…效果很好