输入示例:
[email protected] [email protected],[email protected]
示例输出:
[email protected] [email protected],[email protected]
因此,在“正常”情况下,显然很容易执行以下操作:
sed 's/.com/.org/g'
但显然在这种情况下,我只希望操作第一列中的后缀,我希望第二列保持不变。
我不介意你建议使用什么工具。但我更喜欢它在标准 Linux 上可用,而不需要进一步安装(即类似sed
或awk
或 的东西perl
比 更可取bobsobscuretoolthatneedsinstalling
)。
答案1
如果您只想替换第一次出现的.com
with .org
,您所需要的只是 sed 运算符的默认行为s///
。只是不要使用该g
标志:
$ sed 's/.com/.org/' file
[email protected] [email protected],[email protected]
如果您确实只想对第一个逗号定义的字段进行更改,这样如果第一个字段.com
出现在行中的其他位置,它将保持不变,您可以执行以下操作:
$ perl -pe 's/^(\S+)\.com/$1.org/' file
[email protected] [email protected],[email protected]
或者,如果com
作为子字符串出现(例如foo.common.net
),则更安全:
$ perl -pe 's/^(\S+)\.com\b/$1.org/' file
[email protected] [email protected],[email protected]
或者,在 GNU sed 中:
$ sed -E 's/^(\S+)\.com\b/\1.org/' file
[email protected] [email protected],[email protected]
或者,可移植(假设第一个字段由第一个字段定义)空间而不是制表符或其他空格):
$ sed -E 's/^([^ ])\.com /\1.org /' file
[email protected] [email protected],[email protected]
答案2
$ awk '{ sub("\.com$", ".org", $1); print }' <file
[email protected] [email protected],[email protected]
这用于替换每行的第一个空格分隔字段(仅)中与awk
匹配的文本。输出将以空格分隔。\.com$
.org
答案3
您可以使用 来完成此操作sed
,只需使用只能匹配该行的第一个单词的正则表达式:
sed -r 's/^(\S+)\.com(\s+)/\1.org\2/'
慢动作,改变:
- 从一开始就包含一个或多个非空格的序列 (
^(\S+)
) .com
- 一个或多个非空格的序列(这样我们只能匹配最后一个
.com
)
进入:
- 第一个非空格序列
.org
- 空格的顺序