我有一个包含以下内容的文件:
aaaabbaaabbaa
我需要一个这样的输出:
aaaa
bbaaa
bbaa
我需要在第一次出现'b'
之前添加一个新行。我只需要 SED 命令即可在 bash 中使用
我正在使用以下命令。我知道它现在是完美的。
谁能告诉我比这更好的命令。请注意,我只需要在 bash 中使用 SED 命令
sed -i.bak -e 's/bb/qbb/g' input.txt
sed -i.bak -e 's/qbb/'$'nbb/g' input.txt
with sed
:
$ echo "aaaabbaaabbaa" | sed -r 's/([b]+)/n1/g'
aaaa
bbaaa
bbaa
sed -r
允许用()
捕获块并用1
打印回来。它捕获它的块[b]+
,意思是"one or more b's"
,并在它前面打印一个新行。
正如我看到您正在使用sed -i
,这样做也很好:
sed -i.bak -r 's/([b]+)/n1/g' input.txt
另外,更容易(感谢格伦杰克曼!
$ echo "aaaabbaaabbaa" | sed 's/b+/n&/g'
aaaa
bbaaa
bbaa
它替换了"b"的所有序列,并用换行符替换了它,后跟相同的"b"序列(&
表示s///
左侧匹配的任何内容)。
使用前瞻正则表达式grep -oP
会更容易:
echo 'aaaabbaaabbaa' | grep -oP '.+?[^b](?=(b|$))'
aaaa
bbaaa
bbaa
如果您的输入字符串确实只包含 a
和 b
个字符,那么我认为问题退化为用 a<newline>b
简单地替换所有 ab
实例。 如果是这种情况,则可以完全省略sed
并在 bash 中使用 Shell 参数扩展功能:
在航站楼:
$ str="aaaabbaaabbaa"
$ echo "${str//ab/a
> b}"
aaaa
bbaaa
bbaa
$
或者在 shell 脚本中:
$ cat ab.sh
#!/bin/bash
echo "${1//ab/a
b}"
$ ./ab.sh "aaaabbaaabbaa"
aaaa
bbaaa
bbaa
$
这在 OSX 10.8.5 上对我有用。
此信息也可在 apple.com 托管的 bash 手册页上找到。 在该页面上搜索"参数/模式"。
echo "aaaabbaaabbaanbbaabba" | sed 's/([^b])b/1
b/g'
aaaa
bbaaa
bbaa
bbaa
bba
符合 POSIX 标准,如果行以 b 开头,则不会创建新行
对你有用:
sed -e :a -e '/ab(.*)(.)$/!b' -e G -e 's//a2b1/' -e ta file
这将循环通过当前行将任何ab
组合替换为 anb
。它使用保留空间的副作用,即在创建 sed 的新实例时始终存在换行符。
答案是肯定的:
sed 's/bb*/n&/g' file
或:
sed 's/bb*/'"n"'&/g' file
要容易得多,但可能取决于 sed 或 bash 的 GNU 版本。
sed -e 's/bb/\nn/g' 输入.txt
我让这个工作。它与您的原始尝试非常相似。我使用的是iMac,所以我很确定同样适用于您。
当您想避免新行时b
出现在行首并且所有这些POSIX兼容时。
$ echo -e "aaaabbaaabbaanbbaaaabbaaabbaa" | sed -e 's/([^b])b/1nb/g'
aaaa
bbaaa
bbaa
bbaaaa
bbaaa
bbaa
一个丑陋的awk
版本:)
echo "aaaabbaaabbaa" | awk '{for (i=1;i<=NF;i++) {printf ($i=="b" && f!="b" ?"n":"")"%s",$i; f=$i}} END {print ""}' FS=
aaaa
bbaaa
bbaa
gnu awk
版本
echo "aaaabbaaabbaa" | awk '{$1=$1} NR>1 {$0=RS $0;} 1' RS="bb"
aaaa
bbaaa
bbaa
另一个awk
.将任何b
或b
组替换为换行符及其本身&
echo "aaaabbaaabbaa" | awk 'gsub(/b+/,"n&")'
aaaa
bbaaa
bbaa
说:
$ echo aaaabbaaabbaa | sed 's/b{1,}/'$'n&/g'
aaaa
bbaaa
bbaa
或
$ echo aaaabbaaabbaa | sed $'s/b{1,}/\n&/g'
aaaa
bbaaa
bbaa
为了使正则表达式sed
解释为扩展正则表达式,您可以使用-E
选项:
$ echo aaaabbaaabbaa | sed -E 's/b+/'$'n&/g'
aaaa
bbaaa
bbaa