我有这样的字符串:
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
调用可以理解为:
"@a.[0]\n"
打印第一个元素,@a
后跟换行符,@a.[0].words[0]
在下一行打印第一个元素的第一个单词," @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