Я плохо знаком с форумом, поэтому простите любые синтаксические ошибки в моем вопросе.
Я пытаюсь заменить пробелы символами нижнего подчеркивания в подобранной подстроке только. Я полагал, что sed будет лучшим редактором для этого, но я не могу найти, что надлежащий код делает это.
Демонстрационная строка от file1 ниже:
Некоторый текст перед шаблоном для соответствия href = "./Dynamic Имя каталога - материал Junk_files/irrelevant после соответствия">
Хотел бы измениться на это:
Некоторый текст перед шаблоном для соответствия href = "./Dynamic_Directory_name_-_ материал Junk_files/irrelevant после соответствия">
Я думал, что был, соглашаются с этим cat file1 |sed '/\.\/.*. Junk_files/ { s/ /_/g; }'
но все, что это сделало, было заменить все пробелы на подобранной строке с символами нижнего подчеркивания.
Любая справка с этим была бы, значительно ценят.Спасибо
Через 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
Попытка это, это находит первую пару наклонных черт и удаляет все пробелы между!
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">
Это - 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.
Лучше использовать синтаксический анализатор 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">