使用 sed 或 awk 或 perl 或 bash 将字符串拆分为两部分

使用 sed 或 awk 或 perl 或 bash 将字符串拆分为两部分

我有这样的字符串:

Grades ABCDEF-123456

我想把这个字符串分成两部分,如下所示

Grades ABCDEF
Grades 123456

我怎样才能在 bash 中做到这一点?

答案1

echo Grades "ABCDE-12345" | sed 's/-/ /g' | awk '{ print $1" "$2"\n"$1" "$3'}
Grades ABCDE
Grades 12345

或根据@steeldriver

awk -F'[ -]' '{print $1, $2; print $1, $3}'

答案2

您也可以完全在 shell 中执行此操作:

text="Grades ABCDEF-123456"

拆分主要文本。如果需要,您可以捕获它,但在这里我们将丢弃它:

grades="${text#* }"

现在我们可以将这两部分提取为变量,但现在我们只打印它们:

echo "Grades ${grades%-*}"
echo "Grades ${grades#*-}"

您还可以将它们合并为一个输出语句,但我认为它不具有可读性(即使比某些文本printf类别更安全):echo

printf "Grades %s\nGrades %s\n" "${grades%-*}" "${grades#*-}"

答案3

您可以通过用换行符替换破折号,后跟第一个字段来完成此操作:

perl -alpe 's/-/\n$F[0] /' 

答案4

使用(以前称为 Perl_6)

~$ raku -ne 'my @a = .split("-", 2); put "@a.[0]\n", @a.[0].words[0], " @a.[1]";'   file
Grades ABCDEF
Grades 123456

#OR:

~$ raku -ne '.split("-", 2) andthen put "$_.[0]\n", $_.[0].words[0], " $_.[1]";'   file
Grades ABCDEF
Grades 123456

Raku 是 Perl 家族的一种编程语言。与 Perl 相比,Raku 中的命令行标志更少。上面,Raku 单行被称为带有-ne非自动打印行标记。

第一个答案:逐行输入.split按连-字符分成2几部分,并分配给@a数组。请注意,这.split是调用主题变量(在本例中为行文本)$_.split上的例程的缩写。$_一旦进入@a数组,我们所要做的就是将数据调整为正确的输出格式。 Raku 的words例程会在空白处中断文本。所以最终的put调用可以理解为:

  1. "@a.[0]\n"打印第一个元素,@a后跟换行符,
  2. @a.[0].words[0]在下一行打印第一个元素的第一个单词,
  3. " @a.[1]"在同一(第二)行,打印空格,然后打印 的第二个元素@a

第二个答案:如果您觉得使用方便$_ 主题变量,您可以放弃数组分配并获得相同的输出。请注意,在上面的第二个答案中, 是$_可选的,并且代码可以进一步缩短:您所需要的只是.Raku 的前导点,以了解您希望在$_主题变量上调用例程/索引。

最后,向各种文本片段添加关键“前缀”是一项常见任务。如果您对键/值对感到满意并且可以接受默认排序,那么下面的代码在概念上可能会更简单(返回\t分隔列):

~$ raku -ne 'my %hash = .words[0] => .words[1].split("-", 2);  \
             for %hash.sort {.antipairs.put for .invert };'   file
Grades  ABCDEF
Grades  123456

https://docs.raku.org/routine/split
https://docs.raku.org/routine/invert
https://raku.org

相关内容