Заменить пробелы в подстроке с подстрокой с символами подчеркивания

Я новичок в форуме, поэтому прошу простить любые синтаксические ошибки в моем вопросе.

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

Пример строки из файла1 ниже:

Некоторый текст перед шаблоном для соответствия href = "./ Имя динамического каталога - Junk_files / нерелевантные вещи после совпадения">

Хотелось бы изменить на это:

Некоторое сообщение перед шаблоном для соответствия href = "./ Имя динамического каталога - Junk_files / нерелевантный материал после совпадения">

] Некоторый текст перед шаблоном, чтобы соответствовать href = "./ Dynamic_Directory_name _-_ Junk_files / нерелевантный материал после совпадения">

Я думал, что был близок с этим cat file1 |sed '/\.\/.*. Junk_files/ { s/ /_/g; }', но все, что он сделал, это заменить все пробелы на совпадающем строка с символами подчеркивания.

1
задан 2 March 2016 в 16:11

3 ответа

Попробуйте это, он найдет первую пару косых черт и удалит все пробелы между!

 awk -F'/' '{for(i=2;i<=NF;i++)if(i==2)gsub(" ","_",$i);}1' OFS="/"

Попробуйте это, он найдет первую пару косых черт и удалит все пробелы между!

file='href="./Dynamic Directory name - Junk_files/irrelevant stuff after match">' 
echo $file | awk -F'/' '{for(i=2;i<=NF;i++)if(i==2)gsub(" ","_",$i);}1' OFS="/"
# Output: 
href="./Dynamic_Directory_name_-_Junk_files/irrelevant stuff after match">
1
ответ дан 23 May 2018 в 13:09
  • 1
    В этом примере каждое место в файле заменяется символом подчеркивания. Мне нужно только пробелы в имени папки, которые нужно заменить символами подчеркивания. – dparz 2 March 2016 в 15:45
  • 2
    ОК, я его редактирую, теперь это работает! – wittich 2 March 2016 в 15:52
  • 3
    Ну, может быть, есть еще проблема. как долго ваш URL? Сколько подкаталогов у вас есть? – wittich 2 March 2016 в 15:56
  • 4
    Хорошо, теперь он работает также с поддиректорами. Мне пришлось изменить i%2==0 на i==2! – wittich 2 March 2016 в 16:06
  • 5
    Pls принимает его как правильный ответ если он работает для вас. Если есть лучший ответ, вы всегда можете изменить свой выбор. – wittich 2 March 2016 в 16:14

Лучше использовать парсер XML.

Если вы настаиваете на использовании sed; предполагая, что шаблон остается неизменным:

sed -r 's#^([^/]+/[^ ]+) ([^ ]+) ([^ ]+) - ([^ ]+/)#\1_\2_\3_-_\4#' file.txt

Это заменит все пробелы между двумя косами спуска (/) с символами подчеркивания (_). Поскольку вход содержит /, я использовал # как разделитель шаблонов для sed.

Пример:

% sed -r 's#^([^/]+/[^ ]+) ([^ ]+) ([^ ]+) - ([^ ]+/)#\1_\2_\3_-_\4#' <<<'Some text before pattern to match href="./Dynamic Directory name - Junk_files/irrelevant stuff after match">'
Some text before pattern to match href="./Dynamic_Directory_name_-_Junk_files/irrelevant stuff after match">
0
ответ дан 23 May 2018 в 13:09
  • 1
    Это добавляет только подчеркивания до и после тире в имени папки. Мне нужно, чтобы все пробелы в имени папки заменялись символами подчеркивания. Согласованный шаблон будет href "./ Имя папки с пробелами - Junk_files /. – dparz 2 March 2016 в 15:40
  • 2
    @kos Спасибо .. не заметил..ид .. – heemayl 2 March 2016 в 15:48
  • 3
    @dparz Проверить мое редактирование – heemayl 2 March 2016 в 15:48
  • 4
    Не работает, если имя папки больше. например. [F1]. См. Мой пример: askubuntu.com/a/741165/189996 – wittich 2 March 2016 в 16:11
  • 5
    Это работает, но ограничивается статическим количеством пробелов. Имена папок в файлах, которые мне нужны для редактирования, могут варьироваться в зависимости от количества пробелов в них. Ваш код работает с исходным примером, но не работает ни с одним из них: [Вот еще один href = ". / Это очень длинное имя папки для проверки - Junk_files / blahblah.css "] или [Меньшая папка href = "./ Cat - Junk_files /]. – dparz 2 March 2016 в 16:11

Это HTML, и если вы не имеете достаточно четко определенного достаточно подмножества HTML в вашем файле, разбор HTML с использованием регулярных выражений - довольно плохая идея.

Этот однострочный Perl работает для замены что подстрока в этом конкретном контексте:

printf 'Some text before pattern to match href="./Dynamic Directory name - Junk_files/irrelevant stuff after match">\n' | perl -ne 'if(/(.*?")(.*\/)(.*)/){$x = $1; $y = $2; $z = $3; $y =~ s/ /_/g; print("$x$y$z")}'

Значение: оно просто заменит пробелы символами подчеркивания в первой найденной подстроке " и /. Но это все. Если вы разбираете сложный документ, не используйте его. Вы можете сделать шаблон более строгим (например, вы могли бы использовать /href=(.*?")(.*\/)(.*)/ и print("href=$x$y$z")), но это все равно может потерпеть неудачу при любом появлении /href=(.*?")(.*\/)(.*)/.

Если вы не разбираетесь очень хорошо и вы уверены, что что-то вроде этого не подведет, просто используйте парсер HTML.

0
ответ дан 23 May 2018 в 13:09

Другие вопросы по тегам:

Похожие вопросы: