如何用 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 的线。