仅操作第一列中的文本?

仅操作第一列中的文本?

输入示例:

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

示例输出:

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

因此,在“正常”情况下,显然很容易执行以下操作:

sed 's/.com/.org/g'

但显然在这种情况下,我只希望操作第一列中的后缀,我希望第二列保持不变。

我不介意你建议使用什么工具。但我更喜欢它在标准 Linux 上可用,而不需要进一步安装(即类似sedawk或 的东西perl比 更可取bobsobscuretoolthatneedsinstalling)。

答案1

如果您只想替换第一次出现的.comwith .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/'

慢动作,改变:

  1. 从一开始就包含一个或多个非空格的序列 ( ^(\S+))
  2. .com
  3. 一个或多个非空格的序列(这样我们只能匹配最后一个.com

进入:

  1. 第一个非空格序列
  2. .org
  3. 空格的顺序

相关内容