我是论坛新手,因此请原谅我的问题中的任何语法错误。
我尝试在匹配的子字符串中仅用下划线替换空格。我认为 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 解析器即可。