如何使用sed命令以定界符为逗号的方式交换两个字符串?

这是我第一次在这里发帖,所以我对格式是否很奇怪表示歉意。

使用sed命令,我想将x和y从x,y交换到y,x并将交换的版本存储到单独的文件中。

我应该修改的文件包含

#######bank info########
#
####name####    ####age####
#
Bob,Stevenson       27
David,Tan           43
Robert,Jackson      39

我想将名字从名字,姓氏改为名字,姓氏

我已经尝试使用命令

sed -e "s/^\([^#]*\) *\([,]*\)/\2\1/g" file > xxx

但是,当我检查“交换”文件时,似乎没有任何变化。为什么?

预期输出为:

#######bank info########
#
####name####    ####age####
#
Stevenson,Bob       27
Tan,David           43
Jackson,Robert      39

但是我的输出是:

#######bank info########
#
####name####    ####age####
#
Bob,Jackson      39

与初始版本完全相同。为什么会这样?

zhangzhiwei1986913 回答:如何使用sed命令以定界符为逗号的方式交换两个字符串?

sed '
   # only lines that do not start with a #
   /^#/!{
     # match from the start
     # match up until a comma
     # then match the comma
     # then match up until a space
     # swap the part before the comma and after comma
     s/^\([^,]*\),\([^ ]*\)/\2,\1/
   }

'

版本短一些:

sed '/^#/!s/^\([^,\1/'
,

与@KamilCuk的非常好的答案相同,但是使用扩展的正则表达式和文字字符,您可以做到

sed -E '/,/s/(\w+),(\w+)/\2,\1/' file > newfile

/,/仅在带有','的行上运行,而(\w+)的捕获组匹配一个或多个单词字符的组。 (\w+),(\w+)表达式可确保由逗号分隔的两组单词字符,然后\2,\1只需以相反的顺序重新插入反向引用,例如

使用/输出示例

$ sed -E '/,\1/' file
#######bank info########
#
####name####    ####age####
#
Stevenson,Bob       27
Tan,David           43
Jackson,Robert      39
,

如果您可以使用awk,则可以。

awk -F'[,]+' '/,/{$0=$2","$1"\t"$3}1' file
#######bank info########
#
####name####    ####age####
#
Stevenson,Bob   27
Tan,David       43
Jackson,Robert  39

awk相比,更容易理解sed:)

  • -F'[,]+'用一个或多个逗号或空格分隔行
  • /,/用于带有逗号的行:
  • $0=$2","$1"\t"$3使用逗号和制表符以新顺序重构行
  • 1始终为true,执行默认操作,打印行。
本文链接:https://www.f2er.com/3161497.html

大家都在问