如何使用 sed 和 sort 来抓取两个标记之间的文本并按字母顺序对它们进行排序?

如何使用 sed 和 sort 来抓取两个标记之间的文本并按字母顺序对它们进行排序?

我想做以下事情:

  1. 抓取两个标记之间的所有文本someFile.txt
  2. 将文本放入一个数组中,该数组被分割为\n
  3. 按字母顺序对数组进行排序
  4. 将两个标记之间的文本替换为someFile.txt按字母顺序排列的版本。

someFile.txt操作前:

// __MARKER__
../library/_shared/_shared/components/InfoPill/InfoPill.stories
../library/_shared/_shared/components/IconChevronRightBlack/IconChevronRightBlack.stories
../library/_shared/_shared/components/ButtonPrimary/ButtonPrimary.stories
// __MARKER__

someFile.txt操纵后:

// __MARKER__
../library/_shared/_shared/components/ButtonPrimary/ButtonPrimary.stories
../library/_shared/_shared/components/IconChevronRightBlack/IconChevronRightBlack.stories
../library/_shared/_shared/components/InfoPill/InfoPill.stories
// __MARKER__

答案1

如果perl没问题并且文件足够小以满足内存要求

$ perl -0777 -pe 'BEGIN{$m = "// __MARKER__\n"}
                  s|$m\K.*?(?=\n$m)|join "\n", sort split/\n/,$&|gse' ip.txt 
// __MARKER__
../library/_shared/_shared/components/ButtonPrimary/ButtonPrimary.stories
../library/_shared/_shared/components/IconChevronRightBlack/IconChevronRightBlack.stories
../library/_shared/_shared/components/InfoPill/InfoPill.stories
// __MARKER__
  • -0777将整个文件作为字符串读取
  • $m = "// __MARKER__\n"将标记保存在变量中
  • $m\K.*?(?=\n$m)捕获标记之间的字符串
  • join "\n", sort split/\n/,$&将捕获的字符串拆分\n,然后对其进行排序,最后通过连接数组元素得到单个字符串
  • s允许.匹配的修饰符\n
  • e修饰符以允许替换部分中的代码
  • 使用-i就地编辑选项

相关内容