如何在模式"Using SED"之前插入字符串或换行符(不替换模式) 在 MAC OS 中



我有一个包含以下内容的文件:

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

如果您的输入字符串确实只包含 ab 个字符,那么我认为问题退化为用 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.将任何bb组替换为换行符及其本身&

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

最新更新