替换部分字符串

时间:2011-11-12 00:22:02

标签: python string bash sed split

其实我的问题很简单: 我有一个字符串:101222_1_1_ab; 我希望将其更改为:101222_1_ab_1

我应该使用哪些bash命令?以及如何在python中做? 感谢

7 个答案:

答案 0 :(得分:3)

我能想到的最简单的机制是使用awk(1)

$ echo 101222_1_1_ab | awk -F_ '{print $1 "_" $2 "_" $4 "_" $3;}'
101222_1_ab_1

-F_要求awk(1)将字段拆分为下划线。

更新 Glenn Jackman推荐以下更易读的版本:

awk -F_ -v OFS=_ '{print $1, $2, $4, $3}'

答案 1 :(得分:2)

echo 101222_1_1_ab | sed -r -e 's/(.*_.*_)(.*)_(.*)/\1\3_\2/'

答案 2 :(得分:2)

这可能对您有用:

# echo "101222_1_1_ab" | sed -re 's/(_[^_]+)(_.*)$/\2\1/'
101222_1_ab_1

答案 3 :(得分:2)

FWIW,我会使用awk

$ echo 101222_1_1_ab | awk 'BEGIN {FS = OFS = "_"} {print $1, $2, $4, $3}' 
101222_1_ab_1

但是,既然你问:

  

在python中做什么?

>>> s = '101222_1_1_ab'
>>> s.split('_')
['101222', '1', '1', 'ab']
>>> l = s.split('_')
>>> l[0], l[1], l[3], l[2]
('101222', '1', 'ab', '1')
>>> '_'.join((l[0], l[1], l[3], l[2]))
'101222_1_ab_1'

答案 4 :(得分:1)

如果你想使用sed,这会在下划线处重新分开并重新排列:

echo 101222_1_1_ab | sed 's/\(.*_.*\)_\(.*\)_\(.*\)/\1_\3_\2/'

编辑正如@ dmitry.malikov指出的那样,-r选项可以让它更具可读性:

echo 101222_1_1_ab | sed -r 's/(.*_.*)_(.*)_(.*)/\1_\3_\2/'

答案 5 :(得分:1)

只是使用bash:

word=101222_1_1_ab
new=$(
  IFS=_
  parts=($word)
  tmp=${parts[2]}; parts[2]=${parts[3]}; parts[3]=$tmp
  printf "%s" "${parts[*]}"
)
echo $new # => 101222_1_ab_1

答案 6 :(得分:1)

击:

#!/bin/bash
word='101222_1_1_ab' IFS='_' parts=( $word )
echo "${parts[0]}_${parts[1]}_${parts[3]}_${parts[2]}"

(想把这个回复给格伦杰克曼)