使用正则表达式选择文件名的一部分

时间:2010-01-18 22:56:30

标签: regex text sed unix

我有一个看起来像

的文件
dcdd62defb908e37ad037820f7  /sp/dir/su1/89/asga.gz
7d59319afca23b02f572a4034b  /sp/dir/su2/89/sfdh.gz
ee1d443b8a0cc27749f4b31e56  /sp/dir/su3/89/24.gz
33c02e311fd0a894f7f0f8aae4  /sp/dir/su4/89/dfad.gz
43f6cdce067f6794ec378c4e2a  /sp/dir/su5/89/adf.gz
2f6c584116c567b0f26dfc8703  /sp/dir/su6/895/895.gz
a864b7e327dac1bb6de59dedce  /sp/dir/su7/895/895.gz

如何使用sed替换所有总和*,以便我可以替换为单个值,如

sed "s/REXEXP/newfolder/g" myfile

提前致谢

6 个答案:

答案 0 :(得分:2)

我想你想要

sed 's/su./newfolder/g'

如果您确实想将su1 ... su7中的号码作为newfolder的一部分保留(例如newfolder1 ... newfolder7 ),你可以这样做:

sed 's/su\(.\)/newfolder\1/g'

这还取决于您希望模式的“严格”程度。以上将匹配su后跟任何字符并进行替换。另一方面,s#/su\([0-9]\)/#/newfolder\1/#g之类的命令只匹配/su后跟数字,后跟/。因此,您可能需要相应地调整模式。

答案 1 :(得分:1)

$ sed -e 's|/su[^/]*|/newfolder|' /tmp/files\
dcdd62defb908e37ad037820f7  /sp/dir/newfolder/89/asga.gz
7d59319afca23b02f572a4034b  /sp/dir/newfolder/89/sfdh.gz
...

如果你想摆脱校验和:

$ sed -r -e 's|/su[^/]*|/newfolder|' -e 's/^[^ ]+ +//' /tmp/files\
/sp/dir/newfolder/89/asga.gz
/sp/dir/newfolder/89/sfdh.gz
...

答案 2 :(得分:0)

su[0-9]将匹配一位数。

答案 3 :(得分:0)

sed需要一定量的元字符转义,其中一些可能会稍微关闭。

sed -i -e 's/\/su[^\/]+\//\/newFolder\//g' myfile

答案 4 :(得分:0)

我投票支持Wayne Conrad的答案,因为OP最有可能是OP想要的,但我建议在sed表达式分隔符中使用替换字符,因此:

sed 's|/su[^/]*|/newfolder|'  /tmp/files

这使它更清洁。

另请注意,可能不需要尾随'g'。

答案 5 :(得分:0)

使用awk。因为有一个分隔符,你可以使用'/'。之后,第4列是您想要更改的内容。所以如果你有像/sp/su3dir/su2/89/sfdh.gz这样的路径,su3dir就不会受到影响。

awk -F"/" '{$4="newfolder";}1' OFS="/" file