Linux: Как заменить часть имени файла указанным символом - PullRequest
0 голосов
/ 22 мая 2018

Я хочу заменить часть имени файла указанным символом.

Например:

$ ls
SubNetwork=RNCRAM955E,MeContext=RNCRAM955E_statsfile.xml

Я хочу заменить RNCRAM955E на RNCMST954E

Здесьприходит мой ожидаемый результат.

$ ls
SubNetwork=RNCMST954E,MeContext=RNCMST954E_statsfile.xml

и ниже мой код:

$ find ./ -name '*.xml' | xargs -i echo mv {} {} | sed 's/RNCRAM955E/RNCMST954E/3g' | sh

mv ./SubNetwork=RNCRAM955E,MeContext=RNCRAM955E_statsfile.xml ./SubNetwork=RNCMST954E,MeContext=RNCMST954E_statsfile.xml
mv ./SubNetwork=RNCRAM955E,MeContext=RNCRAM955E_statsfile.xml ./SubNetwork=RNCMST954E,MeContext=RNCMST954E_statsfile.xml
mv ./SubNetwork=RNCRAM955E,MeContext=RNCRAM955E_statsfile.xml ./SubNetwork=RNCMST954E,MeContext=RNCMST954E_statsfile.xml 
mv ./SubNetwork=RNCRAM955E,MeContext=RNCRAM955E_statsfile.xml ./SubNetwork=RNCMST954E,MeContext=RNCMST954E_statsfile.xml

Я не могу понять, что именно код 3g точно означает.

По моему мнению: sed s/xx/xx/3g означает замену шаблона совпадения с 3-го до конца, а sed s/xx/xx/3 означает замену только 3-го сопоставления?Кстати, что именно означает |sh, я думаю, что после echo команда исполняется как оболочка, верно?

1 Ответ

0 голосов
/ 22 мая 2018

3 означает замену 3-го матча, а g означает замену всех матчей.Когда вы используете их вместе, это означает замену всех совпадений, начиная с 3-го.

Передача в sh означает выполнение вывода sed в качестве команд оболочки.

Большинство дистрибутивов Linuxесть команда rename, которая делает это проще:

find . -name '*.xml' -exec rename 's/RNCRAM955E/RNCMST954E/' {} +
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...