gpt4 book ai didi

regex - 在bash中使用sed换行,正则表达式问题

转载 作者:行者123 更新时间:2023-11-29 09:28:17 25 4
gpt4 key购买 nike

大家好,我的数据是这样的

  samplename 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 ...
samplename2 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 ...

我希望它看起来像这样:

  >samplename
0 1 1 1 1 1 1 1 1 1
1 0 0 0 0 0 0 0 0 ...
>samplename2
0 0 0 0 0 1 1 1 1 1
1 1 1 1 1 1 0 0 0 ...

[注意 - 每 10 位数字后显示一个换行符;我实际上想要在每 200 次之后显示它,但我意识到显示这样的一行不会很有帮助]。

我可以在文本编辑器上使用正则表达式来完成,但我想在 bash 中使用 sed 命令,因为我必须多次执行此操作,并且每行需要 200 个字符。

我试过了,但出现错误:

sed -e "s/\(>\w+\)\s\([0-9]+\)/\1\n\2" < myfile > myfile2

sed: 1: "s/(>\w+)\s([0-9]+)/...": 替换模式内未转义的换行符

还有一点要注意——我是在 Mac 上做的;我知道 Mac 上的 sedgnu sed 有点不同。如果您能提供适用于 Mac 的解决方案,那就太好了。

提前致谢。

最佳答案

随着您在 200 个数字后添加换行符的请求,您最好使用 awk

echo "hello 1 2 3 4" | awk '{print ">"$1; for(i=2; i<=NF; i++) {printf("%d ",$i); if((i+1)%2 == 0) printf("\n");}}

打印出来

>hello
1 2
3 4

如果你想让它在以hello开头的行上工作,你可以修改为

echo "hello 1 2 3 4" | awk '/^hello / {print ">"$1; for(i=2; =NF; i++) {printf("%d ",$i); if((i+1)%2 == 0) printf("\n");}}

(// 中的正则表达式表示“仅在与该表达式匹配的行上执行此操作”。

您可以将语句 if( (i + 1) % 2 == 0) 修改为 if( (i + 1) % 100 == 0 )在 100 位数字后换行......我只是为 2 显示它,因为打印输出更具可读性。

更新让这一切变得更干净,执行以下操作。

创建一个名为 breakIt 的文件,包含以下内容:(如果您不想只选择以“hello”开头的行,请省略 /^hello/;但保留 {} 围绕代码,这很重要)。

/^hello/ { print ">"$1;
for(i=2; i<=NF; i++)
{
printf("%d ",$i);
if((i+1)%100 == 0) printf("\n");
}
print "";
}

现在你可以发出命令了

awk -f breakIt inputFile > outputFile

这表示“使用 breakIt 的内容作为处理 inputFile 并将结果放入 outputFile 的命令”。

应该可以很好地满足您的需求。

编辑 以防万一您真的想要一个 sed 解决方案,这里有一个不错的解决方案(我认为是这样)。将以下内容复制到名为 sedSplit

的文件中
s/^([A-Za-z]+ )/>\1\
/g
s/([0-9 ]{10})/\1\
/g
s/$/\
/g

这有三个连续的 sed 命令;它们各占一行,但由于它们插入了换行符,因此它们实际上看起来占用了六行。

s/^                  - substitute, starting from the beginning of the line
([A-Za-z]+ )/ - substitute the first word (letters only) plus space, replacing with
>\1\
/g - the literal '>', then the first match, then a newline, as often as needed (g)

s/([0-9] ]{10})/ - substitute 10 repetitions of [digit followed by space]
\1\
/g - replace with itself, followed by newline, as often as needed

s/$/\
/g - replace the 'end of line' with a carriage return

您可以像这样调用这个 sed 脚本:

sed -E -f sedSplit < inputFile > outputFile

这使用了

-E 标志(使用扩展的正则表达式 - 不需要转义括号等)

-f 标志('从这个文件中获取指令')

它使整个事情变得更加清晰 - 并为您提供您在 Mac 上要求的输出(即使有一个额外的回车符来分隔组;如果您不想那样,请省略最后两行)。

关于regex - 在bash中使用sed换行,正则表达式问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21539010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com