如何从一行中删除字符串

如何从一行中删除字符串

我正在处理包含用户列表的属性文件:例如

[email protected],[email protected]
[email protected],[email protected]
[email protected]
[email protected]
[email protected]

现在,如果我只想删除[电子邮件受保护]仅来自 AdminList。我们如何在 Linux 上使用 sed 或 awk 来做到这一点?我是linux新手,请帮忙

编辑:我不想删除整个值部分。我只想删除特定的字符串。例如,如果我的文件如下所示:

[email protected],[email protected]
[email protected],[email protected]
[email protected]
[email protected],[email protected],[email protected],[email protected]
[email protected]

在这种情况下我只想摆脱[电子邮件受保护]来自管理列表

答案1

情况1:删除完整的“值”部分

假设您的文件仅包含“简单”key=value语句,即“值”部分包含 =标志,您可以使用sed如下:

sed '/^AdminList/s/=.*$/=/' propertyfile.txt

您的示例的输出如下所示:

[email protected],[email protected]
[email protected],[email protected]
[email protected]
AdminList=
[email protected]

这里的想法是用一个简单的 替换(s命令中的 )由 组成的表达式=,后跟任意数量的字符(.*部分)直到行尾(符号) ,但仅限于以 开头的行。$=AdminList

案例 2:从价值清单中扣除特定价值的消费税

如果您只想从逗号分隔的列表中删除一个特定值,我会推荐一种awk基于 - 的方法:

awk '/^AdminList/ {sub(/[email protected],?/,""); print;next} {print}' propertyfile.txt

这将匹配以 开头的行AdminList并替换 模式[email protected],可能尾随,空字符串,打印修改后的行,并跳到下一行执行。对于所有其他行,它将简单地打印整行。

鉴于您的第二个示例输入,这会产生:

[email protected],[email protected]
[email protected],[email protected]
[email protected]
[email protected],[email protected],[email protected]
[email protected]

所选择的语法应该具有相当的可移植性;我已经用 GNU Awk 和 Mawk 对其进行了测试。

答案2

将数据保存在文件(用于测试)test.txt 中

[email protected],[email protected]
[email protected],[email protected]
[email protected]
[email protected]
[email protected]

并使用 sed 或 grep

cat test.txt | sed /AdminList/d
cat test.txt | grep -v AdminList

编辑:

cat test.txt | grep AdminList | awk -F"=" '{print $2}' | sed -n 1'p' | tr ',' '\n' | while read word; do if [ "$word" = "[email protected]" ]; then continue; else echo $word; fi; done

答案3

要直接使用 sed 编辑文件,请使用

sed -i '/[email protected]/d' file

答案4

相关内容