将匹配的子字符串中的空格替换为下划线

将匹配的子字符串中的空格替换为下划线

我是论坛新手,因此请原谅我的问题中的任何语法错误。

我尝试在匹配的子字符串中仅用下划线替换空格。我认为 sed 是最适合此操作的编辑器,但我找不到合适的代码来执行此操作。

以下是 file1 中的样行:

模式之前的一些文本以匹配 href="./动态目录名称 - Junk_files/匹配后不相关的内容">

想改成这样:

模式之前的一些文本以匹配 href="./动态目录名称-垃圾文件/匹配后不相关的内容">

我以为我已经接近这个了cat file1 |sed '/\.\/.*. Junk_files/ { s/ /_/g; }',但它所做的只是用下划线替换匹配行上的所有空格。

任何帮助都将不胜感激。谢谢

答案1

试试这个,它会找到第一对斜线并删除之间的所有空格!

 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

通过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"

通过 perl,

$ echo 'href="./Dynamic Directory name - Junk_files/irrelevant stuff' | perl -pe '
> s/\s(?=(?:(?!\.\/).)*?\/)/_/g
> '
href="./Dynamic_Directory_name_-_Junk_files/irrelevant stuff

答案3

最好使用 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">

答案4

这就是 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 解析器即可。

相关内容