На самом деле мой вопрос довольно прост: У меня есть строка вроде: 101222_1_1_ab
; Надеюсь изменить его на: 101222_1_ab_1
Замена частей строки
Какие команды bash следует использовать? и что делать в python? БЛАГОДАРЯ
На самом деле мой вопрос довольно прост: У меня есть строка вроде: 101222_1_1_ab
; Надеюсь изменить его на: 101222_1_ab_1
Замена частей строки
Какие команды bash следует использовать? и что делать в python? БЛАГОДАРЯ
Самый простой механизм, я могу думать о том, чтобы использовать awk(1)
:
$ echo 101222_1_1_ab | awk -F_ '{print $1 "_" $2 "_" $4 "_" $3;}'
101222_1_ab_1
-F_
просит awk(1)
разделить поля друг от друга на подчеркиванием.
Update Гленн Джекман рекомендует следующее, гораздо более разборчивым, версию:
awk -F_ -v OFS=_ '{print $1, $2, $4, $3}'
Если вы хотите использовать СЭД, это раскалывает на подчеркивании и перестраивает:
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 -r -e 's/(. * _. * _) (. *) _ (. *)/\ 1 \ 3_ \ 2 /' ' –
Кстати, ваш пример возвращает 101222_1_1_ab –
@ dmitry.malikov: Да, очень хорошо. Я отредактирую его. –
echo 101222_1_1_ab | sed -r -e '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?
>>> 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'
+1, так как op запросил подход python –
Просто с Баш:
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]} _ $ {детали [1]} _ $ {детали [3]} _ $ {детали [2]} "' – ata
Bash:
#!/bin/bash
word='101222_1_1_ab' IFS='_' parts=($word)
echo "${parts[0]}_${parts[1]}_${parts[3]}_${parts[2]}"
(хотел поставить это в ответ на Glenn Jackman)
ой глупы меня !!! да ... awk ... – user815408
Вместо жесткого кодирования подчеркивания внутри тела awk вы можете использовать: 'awk -F_ -v OFS = _ '{print $ 1, $ 2, $ 4, $ 3}'' –
@glenn , да, это лучше. Благодаря! – sarnold