Regex 插入“;xyz";到以“开始”开头的行;abc";
我不习惯在任何事情上使用Regex 插入“;xyz";到以“开始”开头的行;abc";,regex,shell,unix,sed,Regex,Shell,Unix,Sed,我不习惯在任何事情上使用sed,我也不确定这是否可行 我需要在文本文件中执行以下操作: 查找以“abc”开头的行 在所述行的“b”和“c”之间插入“xyz” 用新行替换原来的行 一个巨大的警告:如果没有以“abc”开头的行,我需要插入一行,并且必须在以“def”开头的行之前插入该行。(1)您问题的第一部分可以这样做: sed -i .bak 's/^abc/abxyzc/' input_file sed -i .bak 's/^def/NEW_LINE\ndef/' input_file (
sed
,我也不确定这是否可行
我需要在文本文件中执行以下操作:
sed -i .bak 's/^abc/abxyzc/' input_file
sed -i .bak 's/^def/NEW_LINE\ndef/' input_file
(-i.bak
用于就地编辑并创建扩展名为“.bak”的备份文件)
(2) 第二部分,在另一行之前插入一行(不包括“abc”缺失的条件),可以这样做:
sed -i .bak 's/^abc/abxyzc/' input_file
sed -i .bak 's/^def/NEW_LINE\ndef/' input_file
我认为你不能把“如果条件做(1)或者做(2)”作为一行。为此写一个简单的脚本…(1)问题的第一部分可以这样做:
sed -i .bak 's/^abc/abxyzc/' input_file
sed -i .bak 's/^def/NEW_LINE\ndef/' input_file
(-i.bak
用于就地编辑并创建扩展名为“.bak”的备份文件)
(2) 第二部分,在另一行之前插入一行(不包括“abc”缺失的条件),可以这样做:
sed -i .bak 's/^abc/abxyzc/' input_file
sed -i .bak 's/^def/NEW_LINE\ndef/' input_file
我认为你不能把“如果条件做(1)或者做(2)”作为一行。为此编写一个简单的脚本…使用
sed将有点复杂。如果您可以使用awk
,那么以下方法应该可以工作。这对文件执行两次传递。如果它找到/^abc/
,它会按你的要求做。如果未找到/^abc/
,则它将查找/def/
,并在其前面的一行插入xyz
awk '
NR==FNR && /^abc/{
found = 1
$0 = substr($0,0,2) "xyz" substr($0,3)
lines[NR] = $0
next
}
NR==FNR {
lines[NR] = $0
next
}
!found && /^def/ {
lines[FNR-1] = lines[FNR-1] "\nabc"
}
END {
for(line=1; line<=FNR; line++)
print lines[line]
}' file{,} > tmp && mv tmp file
awk'
NR==FNR&/^abc/{
发现=1
$0=substr($0,0,2)“xyz”substr($0,3)
行[NR]=$0
下一个
}
NR==FNR{
行[NR]=$0
下一个
}
!找到&&/^def/{
行[FNR-1]=行[FNR-1]“\nabc”
}
结束{
对于(line=1;linesed将有点复杂。如果您可以使用awk
,则以下操作应该有效。这会对文件执行两次传递。如果它找到/^abc/
,它会按您的要求执行。如果未找到/^abc/
,则它会查找/def/
,并在前面的一行插入xyz
awk '
NR==FNR && /^abc/{
found = 1
$0 = substr($0,0,2) "xyz" substr($0,3)
lines[NR] = $0
next
}
NR==FNR {
lines[NR] = $0
next
}
!found && /^def/ {
lines[FNR-1] = lines[FNR-1] "\nabc"
}
END {
for(line=1; line<=FNR; line++)
print lines[line]
}' file{,} > tmp && mv tmp file
awk'
NR==FNR&/^abc/{
发现=1
$0=substr($0,0,2)“xyz”substr($0,3)
行[NR]=$0
下一个
}
NR==FNR{
行[NR]=$0
下一个
}
!找到&&/^def/{
行[FNR-1]=行[FNR-1]“\nabc”
}
结束{
对于(行=1;行
如果没有“abc”和“def”,我会在末尾打印修改后的“abc”行。您没有指定这种情况
如果没有“abc”和“def”,我会在末尾打印修改后的“abc”行。您没有指定这种情况。这可能适用于您(GNU-sed):
将文件拖到内存中。在行首的ab
和c
之间替换xyz
。如果执行此替换,则中断进一步处理。否则,在行首的def
之前替换换行符。这可能对您有用(GNU-sed):
将文件拖到内存中。在行首的ab
和c
之间替换xyz
。如果执行此替换,则中断进一步处理。否则,在行首的def
之前替换换行符。到目前为止您是否尝试过任何代码?到目前为止您是否尝试过任何代码他的观点?出于好奇,你可以将文件文件
更改为文件{,}
@Jotne谢谢,修复了。出于好奇,你可以将文件
更改为文件{,}
@Jotne谢谢,修复了。