[已解决]UNIX TCSH sed 命令,如何将每个标志分隔成换行符? [已关闭]

问题描述 投票:0回答:2

所以我在给定输入的情况下遇到了这个问题,

-vivoe asdkasvoieshdhas -eavwodugfud -e sadiafwin adjiajdj

我想要这样的输出,

-v
-i
-v
-o
-easdkasvoieshdhas
-eavwodugfud
-esadiafwin
adjiajdj

并且您只能使用 sed 命令来完成此任务。 我已经尝试了我所知道的所有 sed 命令,这对我来说似乎是一个死胡同。有没有办法只使用 sed 命令来解决这个问题?也许 sed 一行行?

unix sed csh tcsh
2个回答
0
投票

这可能对你有用(GNU sed):

sed -E 's/^(-[^e])\B/&\n-/;s/^ ?(-e) ?(\w*)/\1\2\n/;s/^ //;P;D' file

打开扩展正则表达式

-E

如果一行以

-
开头,后面没有
e
并且不是单词结尾,则附加换行符和
-

如果一行以可选空格开头,后跟

-e
,后跟可选空格,最后跟一个单词,请删除空格(如果有)并在该单词后面附加一个换行符。

如果一行以空格开头,请将其删除。

打印直到并包括第一个换行符。

删除第一个换行符(包括第一个换行符)。

注意

D
命令的行为类似于
d
命令,除非模式空间在调用后不为空。然后模式空间的剩余部分将在下一个 sed 周期而不是下一行上表示。


没有

-E
选项:

sed 's/^\(-[^e]\)\B/&\n-/;s/^ \?\(-e\) \?\(\w*\)/\1\2\n/;s/^ //;P;D' file

要分解各个选项并在

-e
之后删除空格,请使用:

sed ':a;s/^\(-[^e]\)\B/&\n-/m;ta;s/\(-e\) \?\(\w+\)/\1\2/mg;s/\n/ /g' file

0
投票

所以这是我想到的正确代码:

sed ':l;s/-\([^e]\)\([vinowe]\)/-\1 -\2/;tl;s/-e *\([^-]\)/-e\1/g;s/ /\n/g;/-e$/{N;s/-e\n/-e/;}'

它可以分隔每个标志并在每个-e后面附加表达式。 给定输入:

-n -vio -e safasfasf -easfasfasf asfasfasf

我得到输出:

-n
-v
-i
-o
-esafasfasf
-easfasfasf
-easfasfasf

所以,我终于找到了解决方案。谢谢@F的回复。 Hauri 和@potong 的回复。

© www.soinside.com 2019 - 2024. All rights reserved.