我有一个文件,其中每一行代表可能包含在“oo”等字符串中的数据。我需要用另一个字符串替换包含字符之间的字符串。“内部”字符串是两个字符的模式,可能包括星号。
以下是一些示例: 原始字符串(OrigStrg):“ oo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . “.”与另一个字符串配对,可能如下所示:“. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ” 第二个字符串将从文件中读取并存储在变量中。
$ echo "$OrigStrg"
o o . . . . . . . . . . . . . . . . . . . . . . . . . . o o
$ echo "$NewLine"
. . . . . . . . . . . . . . . * . . . .
我对正则表达式比较陌生,所以我的无知可能是显而易见的。以下是我的一些尝试:
$ echo $OrigStrg|sed 's/\.\ \+//g'
o o o o
我知道这会消除内部字符串,但我也认识到这是单独处理每个“.”。这也消除了每行开头和结尾的双空格(如果可能的话,我想保留)。
这些似乎都产生相同的输出:
$ echo "$OrigStrg" |sed -r "s/[. ]*/$NewLine/g"
$ echo "$OrigStrg" |sed -r "s/[. ]+/$NewLine/g"
$ echo "$OrigStrg" |sed -r "s/[\". \"]+/$NewLine/g"
. . . . . . . . . . . . . . . * . . . .o . . . . . . . . . . . . . . . * . . . .o . . . . . . . . . . . . . . . * . . . .o . . . . . . . . . . . . . . . * . . . .o . . . . . . . . . . . . . . . * . . . .
这些似乎摆脱了原始的“内部字符串”,但似乎在剩余字符串中每个有双空格的地方都进行了替换。
echo "$OrigStrg" |sed -r "s/[. ]*/$NewLine/"
. . . . . . . . . . . . . . . * . . . .o o . . . . . . . . . . . . . . . . . . . . . . . . . . o o"
此尝试似乎在第一个双空格处插入替换字符串,但随后不会替换原始字符串(因为 sed 语句末尾的 g )。当考虑“.”时,这似乎是有道理的。匹配任何单个字符。这似乎就是所有这些例子中发生的情况。我想我已经很接近了,但很明显我没有正确指定两个字符的字符串序列。
我真正希望的是:“噢……………………噢”
任何帮助表示赞赏。