我有一个纯文本文件。该文件包含一个如下列表:
@"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 ","}'
如果引号内可以有逗号,则您需要以考虑引号转义规则(如果有)的方式来匹配字段。