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

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

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

Демонстрационная строка от file1 ниже:

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

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

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

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

Любая справка с этим была бы, значительно ценят.Спасибо

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

4 ответа

Через Python,

$ echo 'href="./Dynamic Directory name - Junk_files/irrelevant stuff after match"' |
> python -c "import re;
> import sys;
> print re.sub(r'(?<=\./).*?(?=/)', lambda m: m.group().replace(' ', '_'), sys.stdin.read())
> "
href="./Dynamic_Directory_name_-_Junk_files/irrelevant stuff after match"

Через жемчуг,

$ echo 'href="./Dynamic Directory name - Junk_files/irrelevant stuff' | perl -pe '
> s/\s(?=(?:(?!\.\/).)*?\/)/_/g
> '
href="./Dynamic_Directory_name_-_Junk_files/irrelevant stuff
1
ответ дан 7 December 2019 в 12:41

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

 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">
2
ответ дан 7 December 2019 в 12:41

Это - 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 в Вашем файле и Вы уверены , что-то как этот не перестанет работать, просто использовать синтаксический анализатор HTML.

0
ответ дан 7 December 2019 в 12:41

Лучше использовать синтаксический анализатор 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
ответ дан 7 December 2019 в 12:41

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

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