我有一个看起来像
的文件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
提前致谢
答案 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