sed + 如何使用 sed 删除行中其他字符后的单个字符

sed + 如何使用 sed 删除行中其他字符后的单个字符

如何用 sed 删除行中其他字符后的单个字符

例如

   LINE="ABCDE 123 |@ TEST"

我只想删除 LINE 中第一个“|”字符之后存在的 @ 字符

sed 命令将验证:在“|”之后是否存在 @ 字符,如果是,则 sed 将删除 @ 字符

其他例子

    LINE="qwe 123 >|@ sdf g"  (before sed action)

    LINE=="qwe 123 >| sdf g"  (after sed action)

谢谢

答案1

 % echo "ABCDE 123 |@ TEST" | sed 's,|@,|,'

它本质上与您的另一个问题相同。

答案2

您似乎问了很多这样的问题。我建议您熟悉正则表达式,以便更好地理解答案并提出自己的解决方案。正则表达式.info是一个很好的起点。

要编写一个与包含您的案例的行匹配的正则表达式(即 PIPE 之后的 AT),您可以使用

^.*?\|.*?@

这里^表示行的开始,.*?匹配任意字符,但尽可能少,@是文字@,\|是文字|,只是转义了,因为它在正则表达式中有特殊含义。

要删除 AT 符号,您需要指示 sed 将整个句子替换为除 AT 符号之外的所有内容。为此,您需要存储要保留的所有内容。正则表达式使用捕获组来管理这一点。您得到

^(.*?\|.*?)@

您正在寻找的 sed 命令最终看起来像

sed -r 's/^(.*?|.*?)@/\1/'

命令“s”代表替换,我们创建的正则表达式位于第一对之间/(括号和反斜杠被转义)。用于替换匹配的文本位于后面\1,代表第一个捕获组的内容。由于我们没有捕获 AT,所以这应该可以解决问题。

希望对你有帮助。由于我这里没有 sed,如果不进行修改,这可能会或可能不会起作用。=)

答案3

抱歉,目前无法对 Jens 的解决方案发表评论。

Jens 的解决方案中讨论的模式不符合“仅在第一个“|”字符后删除 @ 字符”的要求。符合要求的模式如下:

sed 's/\(^[^|]|\)@/\1/'

这不会修改在 PIPE AT 序列之前具有附加 PIPE 的线。

相关内容