更改列表中项目的顺序

更改列表中项目的顺序

我有一个纯文本文件。该文件包含一个如下列表:

@"Joe", @"211",
@"Bob Nelson", @"132",
@"Jack Sierra", @"3422",
@"Walt Robert", @"14",

该列表不断包含数千个名称...我需要切换元素顺序并将此列表转换为

@"211", @"Joe",
@"132", @"Bob Nelson",
@"3422", @"Jack Sierra",
@"14", @"Walt Robert",

我如何从终端执行此操作?

答案1

这将适用于其中包含空格的字符串:

sed 's/\(@"[^"]*"\), \(@"[^"]*"\)/\2, \1/' input.txt

怎么运行的:

sed - (s)tream (ed)itor 将在每一行输入上执行 (s)ubstosute 命令,
并替换\(@"[^"]*"\), \(@"[^"]*"\)\2, \1.

表示\2第二个匹配(来自第二个大括号)
表示\1第一个匹配(来自第一个大括号)。

大括号必须被转义,所以我们有\(\)。在里面,我们寻找@字符,然后是"字符,然后是与任何时候重复的[^"]字符不同的任何字符",然后是"字符。

然后我们期望,逗号后跟空格和类似的第二组\2

答案2

匹配第一个字段、分隔符和第二个字段,并以相反的顺序打印出来。假设双引号内不能有逗号:

sed -e 's/\(.*,\)\( \)\(.*,\)/\3\2\1/'

由于行尾有逗号,awk 在这里比较笨拙。尽管如此,您可以通过将逗号加空格或/ +/作为字段分隔符来进行交换。

awk -F ', ' '{print $2 " " $1 ","}'

如果引号内可以有逗号,则您需要以考虑引号转义规则(如果有)的方式来匹配字段。

相关内容