【发布时间】:2020-03-26 05:53:05
【问题描述】:
基本上,我有一个格式如下的文件
ABC:123
我想翻转分隔符周围的字符串,所以它看起来像这样
123:ABC
我更喜欢用 bash/linux 工具来做这件事。
感谢您的帮助!
【问题讨论】:
标签: linux bash parsing grep formatting
基本上,我有一个格式如下的文件
ABC:123
我想翻转分隔符周围的字符串,所以它看起来像这样
123:ABC
我更喜欢用 bash/linux 工具来做这件事。
感谢您的帮助!
【问题讨论】:
标签: linux bash parsing grep formatting
使用内部 bash 命令相当容易,假设有两个字段,根据以下记录:
pax:~$ x='abc:123'
pax:~$ echo "${x#*:}:${x%:*}"
123:abc
第一个替换 ${x#*:} 删除了从开始到冒号的所有内容。第二个,${x%:*},删除从冒号到末尾的所有内容。
然后你只需用冒号重新加入它们。
对于您的特定数据并不重要,但% 和# 使用尽可能短的模式。 %% 和 ## 变体将为您提供尽可能长的模式(贪婪)。
顺便说一句,如果您一次只处理一个字符串,这是理想的,因为您不需要启动外部进程来为您完成工作。但是,如果您正在处理整个文件,有更好的方法可以做到这一点,例如使用awk:
pax:~$ printf "abc:123\ndef:456\nghi:789\n" | awk -F: '{print $2 FS $1}'
123:abc
456:def
789:ghi
【讨论】:
#!/bin/sh -x
var1=$(echo -e 'ABC:123' | cut -d':' -f1)
var2=$(echo -e 'ABC:123' | cut -d':' -f2)
echo -e "${var2}":"${var1}"
我使用 cut 将字符串分成两部分,并将这两部分存储为变量。
从那里,可以使用 echo 重新排列您认为合适的变量。
【讨论】:
使用sed。
sed -E 's/(.*):(.*)/\2:\1/' file.txt
将paste 和cut 与进程替换一起使用。
paste -d: <(cut -d : -f2 file.txt) <(cut -d : -f1 file.txt)
针对大量数据/文件的较慢/最慢的 shell 解决方案。
while IFS=: read -r left rigth; do printf '%s:%s\n' "$rigth" "$left"; done < file.txt
【讨论】: