在文件上应用bash中循环的sed inside中的Regex

在文件上应用bash中循环的sed inside中的Regex,bash,awk,sed,cut,edifact,Bash,Awk,Sed,Cut,Edifact,我在变量中有这样的文件(比如说${var_file}): 我还有一个变量$var1,包含INT格式的数字,$var2包含行的开头 我需要一个sed命令(或awk/cut?)或函数,它将作为bash脚本的一部分,在文件中全局(对于所有可能的行)替换$var2行开始(ABC或ABC+123)上+分隔符之间的$var1位置。 还有可能是?+,因为?是转义字符,所以在本例中,+不能用作分隔符,它是普通文本。行的长度应始终足以包含+中定义的$var1中的计数,该计数用于$var2中选定的行开始 位置3的输

我在变量中有这样的文件(比如说
${var_file}
):

我还有一个变量
$var1
,包含INT格式的数字,
$var2
包含行的开头

我需要一个sed命令(或awk/cut?)或函数,它将作为bash脚本的一部分,在文件中全局(对于所有可能的行)替换
$var2
行开始(
ABC
ABC+123
)上
+
分隔符之间的
$var1
位置。 还有可能是
?+
,因为
是转义字符,所以在本例中,
+
不能用作分隔符,它是普通文本。行的长度应始终足以包含
+
中定义的
$var1
中的计数,该计数用于
$var2
中选定的行开始

位置3的输出示例(
$var1=“3”
,介于第3和第4位之间
+
),从
ABC+123
开始(
$var2=“ABC+123”

因此,输出应为:

ABC+123+456++12'\r
DEF+987+98790+12+00'\r
GHI+12+12?+39+123498345+21+1'\r
ABC+485+2?'\r
ABC+34?+8kj+3949+1+sdfkj+sdfkj'\r
GHC+++sdf'\r
ABC+123+++5435'\r
更改在第1行和第7行

如果仅删除以
ABC
$var2=“ABC”
)开头的行中的第三个位置(
$var1=“3”
):

更改在第1、5和7行

有人能帮我吗?我尝试了各种sed命令,但我就是找不到解决方案


谢谢大家!

你的问题不是很清楚,但我认为你想做的是:

awk -v start="$var2" -v col="$var1" '
    BEGIN { FS=OFS="+" }
    { gsub(/[?][+]/,RS) }
    index($0,start)==1 { $(col+1)="" }
    { gsub(RS,"?+") } 1
' file

你的问题不是很清楚,但我认为你想做的是:

awk -v start="$var2" -v col="$var1" '
    BEGIN { FS=OFS="+" }
    { gsub(/[?][+]/,RS) }
    index($0,start)==1 { $(col+1)="" }
    { gsub(RS,"?+") } 1
' file

你可以用sed试试这个

sed 's/?+/\n/g;/'"$var2"'/s/\(+[^+]*\)/+/'"$var1"';s/\n/?+/g' file

你可以用sed试试这个

sed 's/?+/\n/g;/'"$var2"'/s/\(+[^+]*\)/+/'"$var1"';s/\n/?+/g' file

谢谢你,看来效果不错。现在我将用更多的例子来测试它。谢谢,它似乎工作得很好。现在我将在更多的示例中测试它。请注意,将
var2
视为regexp而不是字符串,因此如果var2包含任何BRE元字符,可能会产生不希望的结果,它也会在行的任何位置而不是行的开头测试var2,但锚定会解决这个问题,请注意,它将
var2
视为regexp而不是字符串,因此如果var2包含任何BRE元字符,可能会产生不希望的结果,它也会在行的任何位置而不是行的开头测试var2,但锚定会解决这一问题,