0

我想知道是否有办法像 sed 对行一样按数字获取文本段落(源文件将是 pyx 文件)

sed -n ${i}p

此时我有兴趣将 awk 用于:

awk '/custom-pyx-tag\(/,/\)custom-pyx-tag/'

但我找不到有关此的文档或示例。

我也试图用 gsub(/\r\n/,"; ") int 相同的 awk 命令修剪 "\r\n",但它不起作用,我真的不知道为什么。

任何提示将不胜感激,谢谢

编辑:

这只是一个例子,并不是我的确切需要,但我需要知道如何为一个多用途项目做这件事

假设我已经导出了大量音频文件的 ID3Tags,并且这些文件以类似 pyx 的格式存储,所以最后我将有一个很好的大文件,这个模式对集合中的每个文件重复:

audio-genre(
blablabla
)audio-genre
audio-artist(
bla.blabla
)audio-artist
audio album(
bla-bla-bla
)audio-album
audio-track-num(
0x
)audio-track-num
audio-track-title(
bla.bla-bla
)audio-track-title
audio-lyrics(
blablablablabla
bla.bla.bla.bla
blah-blah-blah
blabla-blabla
)audio-lyrics
...

现在,如果我想提取第 1234 个音频文件的艺术家,我可以使用:

awk '/audio-artist\(/, /)audio-artist/' | sed '/audio-artist/d' | sed -n 1234p

所以作为一行可以用 sed 获得,但我不知道如何在给定索引的情况下获得整个段落,例如,如果我想获得第 6543 个文件的歌词,我该怎么做?

最后只是一个问题,是否有一个命令相当于 sed -n $ {num} p 但用于段落

4

1 回答 1

0
awk -v indx=1024 
    'BEGIN {
             RS=""
           }
           { split($0,arr,"audio-artist");
             for (i=2;i<=length(arr);i=i+2) 
                                          { gsub("[()]","",arr[i]);
                                            arts[cnt+=1]=arr[i] 
                                          } 
            } 
     END { 
            print arts[indx] 
         }' audioartist

一个班轮:

awk -v indx=1234 'BEGIN {RS=""} NR==1 { split($0,arr,"audio-artist");for (i=2;i<=length(arr);i=i+2) { gsub("[()]","",arr[i]);arts[cnt+=1]=arr[i] } } END { print arts[indx] }' audioartist

使用 awk 和名为 audioartist 的文件,我们通过将记录分隔符 (RS) 设置为 "" 来将文件作为一行使用。然后,我们根据分隔符 audio-artist 将整个文件拆分为数组 arr。我们从 2 开始以 2 为步长查看数组 arr 直到数组末尾,并去掉左括号和右括号,创建另一个名为arts 的数组,其索引为递增计数,删除的艺术家为值。最后,我们打印由传递的 indx 变量指定的艺术索引(在本例中为 1234)。

于 2020-11-09T15:26:24.997 回答