выберите часть имени файла с помощью регулярных выражений - PullRequest
0 голосов
/ 19 января 2010

У меня есть файл, который выглядит как

dcdd62defb908e37ad037820f7  /sp/dir/su1/89/asga.gz
7d59319afca23b02f572a4034b  /sp/dir/su2/89/sfdh.gz
ee1d443b8a0cc27749f4b31e56  /sp/dir/su3/89/24.gz
33c02e311fd0a894f7f0f8aae4  /sp/dir/su4/89/dfad.gz
43f6cdce067f6794ec378c4e2a  /sp/dir/su5/89/adf.gz
2f6c584116c567b0f26dfc8703  /sp/dir/su6/895/895.gz
a864b7e327dac1bb6de59dedce  /sp/dir/su7/895/895.gz

Как использовать sed для замены всех su *, чтобы я мог заменить одно значение, например

sed "s/REXEXP/newfolder/g" myfile

заранее спасибо

Ответы [ 6 ]

2 голосов
/ 19 января 2010

Я думаю, что вы хотите

sed 's/su./newfolder/g'

Если вы действительно хотите сохранить число в su1 ... su7 как часть newfolder (например, newfolder1 ... newfolder7), вы можете сделать:

sed 's/su\(.\)/newfolder\1/g'

Это также зависит от того, насколько «строгими» вы хотите, чтобы ваши шаблоны были. Выше будет соответствовать su, за которым следует любой символ, и выполнить замену. С другой стороны, команда, подобная s#/su\([0-9]\)/#/newfolder\1/#g, будет соответствовать только /su, за которым следует цифра, за которой следует /. Так что вам, возможно, придется скорректировать свой шаблон соответствующим образом.

1 голос
/ 19 января 2010
$ sed -e 's|/su[^/]*|/newfolder|' /tmp/files\
dcdd62defb908e37ad037820f7  /sp/dir/newfolder/89/asga.gz
7d59319afca23b02f572a4034b  /sp/dir/newfolder/89/sfdh.gz
...

Если вы также хотите избавиться от контрольных сумм:

$ sed -r -e 's|/su[^/]*|/newfolder|' -e 's/^[^ ]+ +//' /tmp/files\
/sp/dir/newfolder/89/asga.gz
/sp/dir/newfolder/89/sfdh.gz
...
0 голосов
/ 19 января 2010

используйте awk. поскольку есть разделитель, который вы можете использовать, '/'. после этого столбец 4 - это то, что вы хотите изменить. Так что если у вас есть пути, такие как /sp/su3dir/su2/89/sfdh.gz, на su3dir это не повлияет.

awk -F"/" '{$4="newfolder";}1' OFS="/" file
0 голосов
/ 19 января 2010

Я голосую за ответ Уэйна Конрада, как наиболее вероятный ответ ОП, но я бы предложил использовать альтернативный символ для разделителя выражений sed, например:

sed 's|/su[^/]*|/newfolder|'  /tmp/files

Это делает его немного чище.

Обратите внимание, что конечный "g", вероятно, не нужен.

0 голосов
/ 19 января 2010

sed требует выделения большого количества метасимволов, некоторые из них могут быть немного неактивными.

sed -i -e 's/\/su[^\/]+\//\/newFolder\//g' myfile
0 голосов
/ 19 января 2010

su[0-9] будет соответствовать одной цифре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...