Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 带$0的AWK使用sed将模式替换为新字符串_Linux_Awk_Sed - Fatal编程技术网

Linux 带$0的AWK使用sed将模式替换为新字符串

Linux 带$0的AWK使用sed将模式替换为新字符串,linux,awk,sed,Linux,Awk,Sed,我有一个包含多个作业内容的文件,如: insert_job: 18132_TAL_D_DS_PEAR_AUTORECON job_type: CMD command: $ADM_BIN/pear_generic_wrapper.ksh owner: gpadmin permission: 在这里,我需要为每个insert_作业添加一行,如下所示: insert_job: 18132_TAL_D_DS_PEAR_AUTORECON job_type: CMD condition:

我有一个包含多个作业内容的文件,如:

insert_job: 18132_TAL_D_DS_PEAR_AUTORECON   job_type: CMD 
command: $ADM_BIN/pear_generic_wrapper.ksh 
owner: gpadmin
permission: 
在这里,我需要为每个insert_作业添加一行,如下所示:

insert_job: 18132_TAL_D_DS_PEAR_AUTORECON   job_type: CMD 
condition: 18132_D_DS_PEAR_AUTORECON  
因此,基本上有两个步骤(首先复制行作业名称;然后在作为条件打印的第二个复制行中将
18132_TAL_
替换为
18132_

为此,我对每个insert_作业行执行以下操作:

insert_job: 18132_TAL_D_DS_PEAR_AUTORECON   job_type: CMD 
insert_job: 18132_TAL_D_DS_PEAR_AUTORECON 
现在,要更新第2行以将insert_作业替换为condition,并将
18132_TAL_
替换为
18132_
,我被卡住了

我正在尝试编写类似以下内容的代码:

$ cat input.dat | awk '($0!~"job_type") {print $0|sed "s/insert_job/condition/"} 1' 
但是,sed在这里不起作用,它给出了语法错误


在打印$0后,您能否帮助了解使用sed的正确语法

awk '
/insert_job/{
  val=$2
  sub(/_[^_]*/,"",val)
  $0=$0 ORS "condition: " val
  val=""
}
1
' Input_file
解释:为上述代码添加解释

awk '                            ##Starting awk code from here.
/insert_job/{                    ##Checking condition if string insert_job is found in a line then do following.
  val=$2                         ##Creating variable val whose value is $2(2nd field) of current line.
  sub(/_[^_]*/,"",val)           ##Substituting _ till next occurrence of _ with NULL in val here.
  $0=$0 ORS "condition: " val    ##Concatenating ORS(new line) then string condition and variable val here.
  val=""                         ##Nullifying variable val here.
}
1                                ##1 will print edited/non-edited line here.
'  Input_file                    ##Mentioning Input_file name here.
输出如下:


你能试试下面的吗

awk '
/insert_job/{
  val=$2
  sub(/_[^_]*/,"",val)
  $0=$0 ORS "condition: " val
  val=""
}
1
' Input_file
解释:为上述代码添加解释

awk '                            ##Starting awk code from here.
/insert_job/{                    ##Checking condition if string insert_job is found in a line then do following.
  val=$2                         ##Creating variable val whose value is $2(2nd field) of current line.
  sub(/_[^_]*/,"",val)           ##Substituting _ till next occurrence of _ with NULL in val here.
  $0=$0 ORS "condition: " val    ##Concatenating ORS(new line) then string condition and variable val here.
  val=""                         ##Nullifying variable val here.
}
1                                ##1 will print edited/non-edited line here.
'  Input_file                    ##Mentioning Input_file name here.
输出如下:


这就是你想做的吗

$ awk '
    { print }
    sub(/^insert_job/,"condition") {
        sub(/_TAL/,"")
        print $1, $2
    }
' file
insert_job: 18132_TAL_D_DS_PEAR_AUTORECON   job_type: CMD
condition: 18132_D_DS_PEAR_AUTORECON
command: $ADM_BIN/pear_generic_wrapper.ksh
owner: gpadmin
permission:

当您使用awk时,您永远不需要sed,而且awk不是一个shell,它是一个完全独立的工具,有自己的语言、语法和语义,所以您不应该尝试使用shell语法从中调用其他UNIX工具。

您正试图这样做吗

$ awk '
    { print }
    sub(/^insert_job/,"condition") {
        sub(/_TAL/,"")
        print $1, $2
    }
' file
insert_job: 18132_TAL_D_DS_PEAR_AUTORECON   job_type: CMD
condition: 18132_D_DS_PEAR_AUTORECON
command: $ADM_BIN/pear_generic_wrapper.ksh
owner: gpadmin
permission:

当您使用awk时,您永远不需要sed,而且awk不是一个shell,它是一个完全独立的工具,有自己的语言、语法和语义,因此您不应该试图使用shell语法从中调用其他UNIX工具。

工作得很好。谢谢效果很好。谢谢