awk中的正斜杠替换

awk中的正斜杠替换,awk,Awk,我开始学习awk。在这里,我试图生成一个目录中所有歌曲专辑的格式化列表,其中有许多子目录(年份范围)。但最后一个gsub替换并没有删除正斜杠。我知道可以通过多种方式使用bash实用程序(如sed)来实现。但我想了解为什么这在awk中不起作用 lst=$(mktemp) find . | grep -vE "\.mp3|\.sh|\."$ > $lst #| tee $lst gawk -F"/" '{ if(NF>2){ gsub(".tar.gz","",$3) gsub(".zi

我开始学习awk。在这里,我试图生成一个目录中所有歌曲专辑的格式化列表,其中有许多子目录(年份范围)。但最后一个gsub替换并没有删除正斜杠。我知道可以通过多种方式使用bash实用程序(如sed)来实现。但我想了解为什么这在awk中不起作用

lst=$(mktemp)
find . | grep -vE "\.mp3|\.sh|\."$ > $lst #| tee $lst
gawk -F"/" '{
if(NF>2){
gsub(".tar.gz","",$3)
gsub(".zip","",$3)
gsub(".ZIP","",$3)
gsub("/","",$3)
print $3
}
else
print$0
}' $lst
exit 0
这很好:

echo "test/more" | awk '{gsub("/","",$0)}1'
testmore
因此,您的代码中可能存在其他错误。

发布输入数据,以及您喜欢输出数据的方式。 尝试使用正则表达式

echo "test/more" | awk '{gsub(/\//,"",$0)}1'
testmore
gsub(regexp,replacement[,target])
这很好:

echo "test/more" | awk '{gsub("/","",$0)}1'
testmore
因此,您的代码中可能存在其他错误。

发布输入数据,以及您喜欢输出数据的方式。 尝试使用正则表达式

echo "test/more" | awk '{gsub(/\//,"",$0)}1'
testmore

gsub(regexp,replacement[,target])

您使用“
/
”作为字段分隔符,因此
$3
将永远不会有“
/

您使用“
/
”作为字段分隔符,因此
$3
将永远不会有“
/

您可以将脚本简化如下(我的意见):

find . | awk '
!/(\.mp3|\.sh|\.)$/ {
    n=split($0,a,"/")
    if(n>2){
        sub(".tar.gz","",a[3])
        sub(".zip","",a[3])
        gsub(".ZIP","",a[3])
        print a[3]
    }
    else
        print $0
}'

您可以将您的脚本(我的意见)简化如下:

find . | awk '
!/(\.mp3|\.sh|\.)$/ {
    n=split($0,a,"/")
    if(n>2){
        sub(".tar.gz","",a[3])
        sub(".zip","",a[3])
        gsub(".ZIP","",a[3])
        print a[3]
    }
    else
        print $0
}'

请注意,
print$0
中的
print
$0
之间缺少空格,
grep-vE“\.mp3\.sh”$>$lst
中的双引号后面还有
$
。。或者这可能是正则表达式的一部分,用于
grep
?歌曲专辑文件的扩展名是什么?如果是
.mp3
,为什么要grep
grep-vE“\.mp3\.sh\.$
?您需要在正则表达式周围加一个括号,比如
”(\.mp3\.sh\.$”
,如果不是,则
$
将只在最后一个替换项上匹配(即
\.$
,您还将排除
a.mp3.gz
等文件。请注意,在
print$0
中,在
print$0
中,在
grep-vE“\.mp3\.sh”中的双引号后面缺少
$
。)$>$lst
。或者这可能是regex到
grep
的一部分?歌曲专辑文件有什么扩展名?如果是
.mp3
,为什么要grep
grep-vE“\.mp3\.sh”$
?你需要在regex周围加一个括号,比如
”(\.mp3\.sh\)$”
,如果没有,则
$
将仅在最后一次替换时匹配(即
\.$
,并且您还将排除像
a.mp3.gz
这样的文件。所使用的OP
-F”/“
选项。这使它成为一个字段分隔符,因此,
$3
将不会有任何
/
@Jotne Yes输入数据,预期输出会很好:)@alvits我在添加答案后看到:)OP使用了
-F/“在他的
gawk
命令中的
选项。这使它成为一个字段分隔符,因此
$3
将不会有任何
/
@Jotne是的输入数据和预期的输出会很好:)@alvits我在添加答案后确实看到了:)是的,我理解我的错误。是的,我理解我的错误。