Замена частей строки - PullRequest
       35

Замена частей строки

2 голосов
/ 12 ноября 2011

На самом деле мой вопрос довольно прост: У меня есть строка вроде: 101222_1_1_ab; Я надеюсь изменить это на: 101222_1_ab_1

Какие команды bash мне следует использовать? а что делать в питоне? БЛАГОДАРЯ

Ответы [ 7 ]

3 голосов
/ 12 ноября 2011

Самый простой механизм, который я могу придумать, это использовать awk(1):

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

-F_ просит awk(1) разделить поля на подчеркивания.

Обновление Гленн Джекман рекомендует следующую, более разборчивую версию:

awk -F_ -v OFS=_ '{print $1, $2, $4, $3}'
2 голосов
/ 12 ноября 2011

FWIW, я бы использовал для этого awk.

$ 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'
2 голосов
/ 12 ноября 2011

Это может работать для вас:

# echo "101222_1_1_ab" | sed -re 's/(_[^_]+)(_.*)$/\2\1/'
101222_1_ab_1
2 голосов
/ 12 ноября 2011
echo 101222_1_1_ab | sed -r -e 's/(.*_.*_)(.*)_(.*)/\1\3_\2/'
1 голос
/ 12 ноября 2011

Bash:

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

(хотел поставить это в ответ Гленну Джекману)

1 голос
/ 12 ноября 2011

Просто с 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
1 голос
/ 12 ноября 2011

Если вы хотите использовать 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/'
...