Chciałbym zmienić plik o nazwie takiej jak:
d1-a2_A1_B1.txt
abcd_A90_B2.txt
gdzie chcę wstawić _FOO
między pierwszy, _A[0-9]\+
a _B[0-9]
więc nazwy plików stają się
d1-a2_A1_FOO_B1.txt
abcd_A90_FOO_B2.txt
Ale moje wyrażenie regularne nie działa:
for f in $(ls); do mv $f \`echo $f | sed -e s/\(.*_A[0-9]\+\)\(_B[0-9].*\)/$1_FOO$2/\`; done
Próbowałem z jednym ciągiem:
echo abcd_A90_B2.txt | sed -e s/\(.*_A[0-9]\+\)\(_B[0-9].*\)/$1_FOO$2/
OK: zadziałało:
echo abcd_A90_B2.txt | sed -e 's/\(_A[0-9]\+\)\(_B[0-9]\)/\1_FOO\2/'
Odpowiedzi:
-r
opcję dosed
(aby użyć rozszerzonych wyrażeń regularnych; normalnie nie rozumie+
).sed
skrypt w cudzysłowie (najlepiej pojedyncze).Zmień
$1
iw$2
swoim skrypcie na\1
i\2
:Również,
`…`
na$(…)
- zobacz to , to i tamto - tj. Obsługuj wecho | sed
taki sam sposób, jak to robiszls
.for f in *
(zamiastfor f in $(ls)
).echo "$f"
), Chyba że masz dobry powód, aby tego nie robić i jesteś pewien, że wiesz, co robisz.źródło
Możesz uniknąć używania sed i innych manipulacji ciągiem, używając
mmv
:(Pomiń
-n
lub zamień na,-v
aby faktycznie zmienić nazwę plików, gdy potwierdzisz, że wszystkie pliki są dopasowane i zmieniają nazwy zgodnie z potrzebami.źródło