sed 内的正则表达式在 bash 中循环应用于文件

Regex inside sed inside for cycle in bash applied on file

我在变量中有这样的文件(假设 ${var_file}):

ABC+123+456+789+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++235+5435'\r

我还有一个包含 INT 格式数字的变量 $var1 和包含行首的 $var2

我需要一个 sed 命令(或 awk/cut?)或将成为 bash 脚本的一部分的函数,它将替换 + 分隔符之间的 $var1 位置$var2 行开始(例如 ABCABC+123),全局在文件上(对于所有可能的行)。 还有可能是 ?+,因为 ? 是转义字符,所以在这种情况下 + 不能用作分隔符,它是普通文本。对于在 $var2.

中开始的选定行,行应始终足够长以包含 $var1 中定义的 + 计数

ABC+123 ($var2 = "ABC+123")

开头的行中位置 3($var1 = "3",第 3 和第 4 + 之间)的输出示例

因此输出应该是:

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"):

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++sdfkj+sdfkj'\r
GHC+++sdf'\r
ABC+123+++5435'\r

更改在第 1、5 和 7 行。

有人可以帮我解决这个问题吗?我尝试了各种 sed 命令,但找不到解决方案。

谢谢!

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

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

你可以用 sed 试试这个

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