Replace 在作为路径列表的文本文件中,在具有特定扩展名的文件之前插入目录

Replace 在作为路径列表的文本文件中,在具有特定扩展名的文件之前插入目录,replace,sed,awk,Replace,Sed,Awk,我在files.txt中有一个文件列表,这是一个非常简化的示例 $FOO%foo\bar\biz.asmx %FOO%foo\bar\biz.cs %FOO%baz\bar\foo\biz.asmx 我希望在.asmx文件路径中插入App\u code,如: $FOO%foo\bar\App_code\biz.asmx %FOO%foo\bar\biz.cs %FOO%baz\bar\foo\App_Code\biz.asmx 虽然我使用的是windows操作系统,但我有gnuwin32,它

我在files.txt中有一个文件列表,这是一个非常简化的示例

$FOO%foo\bar\biz.asmx
%FOO%foo\bar\biz.cs
%FOO%baz\bar\foo\biz.asmx
我希望在
.asmx
文件路径中插入
App\u code
,如:

$FOO%foo\bar\App_code\biz.asmx
%FOO%foo\bar\biz.cs
%FOO%baz\bar\foo\App_Code\biz.asmx
虽然我使用的是windows操作系统,但我有gnuwin32,它提供了sed/awk/grep和其他一些奇特的东西

我并不执着于某个特定的解决方案,但我对我的启蒙运动的sed/awk路线感兴趣

我试过:
sed“s/\\([:alnum:]*)\.asmx/App\u code\/{1}/”
我原以为它会捕获路径分隔符(文件名)后的任何字母数字字符,后跟
.asmx
,然后将其替换为'App_code{contents of group}。
有些东西坏了,因为它永远找不到我想要的东西。我正在努力阅读文档和示例,希望您能提供建议和指导。

在Windows上引用是一件痛苦的事情,因此请将以下脚本放入名为
appcode.awk
的文件中:

BEGIN {
    FS=OFS="\\"
}
$NF~/[.]asmx/{
    $NF = "App_code" OFS $NF
}
{
    print
}
然后像这样跑:

$ awk -f appcode.awk file
$FOO%foo\bar\App_code\biz.asmx
%FOO%foo\bar\biz.cs
%FOO%baz\bar\foo\App_code\biz.asmx
使用
awk

awk -F\\ '/\.asmx/ {$NF="App_Code\\"$NF}1' OFS=\\ file
$FOO%foo\bar\App_Code\biz.asmx
%FOO%foo\bar\biz.cs
%FOO%baz\bar\foo\App_Code\biz.asmx

使用
sed

sed -r 's/(\\\w+\.asmx)/\\App_Code\1/' files.txt
输出:

$FOO%foo\bar\App_Code\biz.asmx
%FOO%foo\bar\biz.cs
%FOO%baz\bar\foo\App_Code\biz.asmx
编辑

根据中的建议,可以删除捕获组,并且可以在同一命令中使用
&

sed -r 's/\\\w+\.asmx/\\App_Code&/' files.txt

回想一下,reg exper中的“*”表示前面的exper的零个或多个(在您的例子中[:alnum:])。要使至少一个exper匹配,您需要像
[:alnum:[:alnum::*
一样进行复制,以保证至少匹配一个
[:alnum:
。我很确定这并不能解决你的问题,但由于你对“我的启蒙”感兴趣,我很高兴为你澄清这一点。祝你好运