仅在第一列中操作文本?

Lit*_*ode 4 sed awk perl text-processing

示例输入:

foobar@example.com foo@example.com,bar@example.com
Run Code Online (Sandbox Code Playgroud)

示例输出:

foobar@example.org foo@example.com,bar@example.com
Run Code Online (Sandbox Code Playgroud)

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

sed 's/.com/.org/g'
Run Code Online (Sandbox Code Playgroud)

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

我不介意你建议使用什么工具。但我更喜欢它在标准 linux 上可用而无需进一步安装(即类似于sedawkperl更可取的东西bobsobscuretoolthatneedsinstalling)。

ter*_*don 5

如果您只想替换第一次出现的.comwith .org,您所需要的只是 seds///运算符的默认行为。只是不要使用g标志:

$ sed 's/.com/.org/' file 
foobar@example.org foo@example.com,bar@example.com
Run Code Online (Sandbox Code Playgroud)

如果您真的只想对第一个逗号定义的字段进行更改,以便如果第一个.com出现在行中的其他地方,它将保持不变,您可以执行以下操作:

$ perl -pe 's/^(\S+)\.com/$1.org/' file 
foobar@example.org foo@example.com,bar@example.com
Run Code Online (Sandbox Code Playgroud)

或者,如果com作为子字符串出现,则更安全(例如foo.common.net):

$ perl -pe 's/^(\S+)\.com\b/$1.org/' file 
foobar@example.org foo@example.com,bar@example.com
Run Code Online (Sandbox Code Playgroud)

或者,在 GNU sed 中:

$ sed -E 's/^(\S+)\.com\b/\1.org/' file 
foobar@example.org foo@example.com,bar@example.com
Run Code Online (Sandbox Code Playgroud)

或者,可移植(假设第一个字段由第一个空格而不是制表符或其他空格定义):

$ sed -E 's/^([^ ])\.com /\1.org /' file 
foobar@example.org foo@example.com,bar@example.com
Run Code Online (Sandbox Code Playgroud)