所以我在给定输入的情况下遇到了这个问题,
-vivoe asdkasvoieshdhas -eavwodugfud -e sadiafwin adjiajdj
我想要这样的输出,
-v
-i
-v
-o
-easdkasvoieshdhas
-eavwodugfud
-esadiafwin
adjiajdj
并且您只能使用 sed 命令来完成此任务。 我已经尝试了我所知道的所有 sed 命令,这对我来说似乎是一个死胡同。有没有办法只使用 sed 命令来解决这个问题?也许 sed 一行行?
这可能对你有用(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
所以这是我想到的正确代码:
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 的回复。