Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 更换部分字符串_Python_String_Bash_Sed_Split - Fatal编程技术网

Python 更换部分字符串

Python 更换部分字符串,python,string,bash,sed,split,Python,String,Bash,Sed,Split,其实我的问题很简单: 我有这样一个字符串:101222_1_1_ab; 我希望将其更改为:101222_1_ab_1 我应该使用什么bash命令?在python中做什么? 谢谢我能想到的最简单的机制是使用awk(1): -F要求awk(1)在下划线上拆分字段 更新格伦·杰克曼推荐以下更清晰的版本: awk -F_ -v OFS=_ '{print $1, $2, $4, $3}' 如果要使用sed,将在下划线处拆分并重新排列: echo 101222_1_1_ab | sed 's/\(.*_

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

我应该使用什么bash命令?在python中做什么?
谢谢

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

-F
要求
awk(1)
在下划线上拆分字段

更新格伦·杰克曼推荐以下更清晰的版本:

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

如果要使用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/'

这可能适合您:

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

FWIW,我会用
awk
来做这个

$ echo 101222_1_1_ab | awk 'BEGIN {FS = OFS = "_"} {print $1, $2, $4, $3}' 
101222_1_ab_1
但既然你问:

在python中做什么

就拿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
狂欢节:


(想把这句话作为对格伦·杰克曼的回答)

如果没有这么多的逃逸,它看起来会更好。
echo 101222_1_1_ab | sed-r-e's/(.........*)/\1\3\u\2/”
顺便说一句,你的例子返回101222_1_1_ab@dmitry.malikov:在上一次编辑中,我在其中剪切粘贴了额外的单引号,这使得它不正确。我修正了这个问题。你可以使用:
awk-F\uv-OFS={print$1,$2,$4,$3}'
@glenn,是的,这样更好。谢谢可以缩短为
#/bin/bash
word='101222_1_1_ab'IFS=''parts=($word)
echo“${parts[0]}{parts[1]}{parts[3]}{parts[2]}”
$ echo 101222_1_1_ab | awk 'BEGIN {FS = OFS = "_"} {print $1, $2, $4, $3}' 
101222_1_ab_1
>>> 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'
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
#!/bin/bash
word='101222_1_1_ab' IFS='_' parts=( $word )
echo "${parts[0]}_${parts[1]}_${parts[3]}_${parts[2]}"