将多个 sed 命令合并为一个

Combine multiple sed commands into one

我有一个文件 example.txt,我想删除并替换其中的字段。

下面的命令很好,但是很乱,不幸的是我是sed命令的菜鸟。

我使用的命令:

sed 's/\-I\.\.\/\.\.\/\.\.//\n/g' example.txt > example.txt1

sed 's/\-I/\n/g' example.txt1 > example.txt2

sed '/^[[:space:]]*$/d' > example.txt2 example.txt3

sed 's/\.\.\/\.\.\/\.\.//g' > example.txt3 example.txt

然后我将删除所有不需要的文件。

我正在尝试获得以下结果:

Common/Components/Component
Common/Components/Component1
Common/Components/Component2
Common/Components/Component3
Common/Components/Component4
Common/Components/Component5
Common/Components/Component6
Comp
App

文件如下所示:

-I../../../Common/Component -I../../../Common/Component1 -I../../../Common/Component2 -I../../../Common/Component3 -I../../../Common/Component4 -I../../../Common/Component5 -I../../../Common/Component6 -IComp  -IApp  ../../../ 

我想知道如何使用 sed 工具或 awk.

调用 1 次将输入格式转换为输出格式标准文本处理工具的最佳方法

怎么样

sed -i 's/\-I\.\.\/\.\.\/\.\.//\n/g
s/\-I/\n/g
/^[[:space:]]*$/d
s/\.\.\/\.\.\/\.\.//g' example.txt

使用sed

$ sed 's|\([A-Z][^/]*/\)\([A-Z][^0-9 ]*\)|s/|g;s/-I/\n/g;s/\.[^[:alnum:]]*//g' input_file

Common/Components/Component
Common/Components/Component1
Common/Components/Component2
Common/Components/Component3
Common/Components/Component4
Common/Components/Component5
Common/Components/Component6
Comp
App

如果您真的不想在某些输出行的中间添加字符串 /Components 那么这可能就是您想要的,在每个 Unix 上使用任何 shell 中的任何 awk盒子:

$ awk -v RS=' ' 'sub("^-I[./]*","")' file
Common/Component
Common/Component1
Common/Component2
Common/Component3
Common/Component4
Common/Component5
Common/Component6
Comp
App

如果您输入的任何路径包含空白,但您没有在您的问题中表明这种可能性,那么我认为这不会发生。

使用您显示的示例,请尝试以下 awk 代码。在 GNU awk.

中编写和测试
awk -v RS='-I\S+' 'RT{sub(/^-I.*Common\//,"Common/Components/",RT);sub(/^-I/,"",RT);print RT}' Input_file

样本输出如下:

Common/Components/Component
Common/Components/Component1
Common/Components/Component2
Common/Components/Component3
Common/Components/Component4
Common/Components/Component5
Common/Components/Component6
Comp
App

解释: 简单的解释就是,在 GNU 中 awk。将 RS(记录分隔符)设置为 -I\S+ -I 直到 space 出现。在主程序 awk 中,检查 RT 是否为 NOT NULL,在 RT 中用 Common/Components/ 替换从 -I 到 Common ,然后在 RT 中用 NULL 替换从 -I 开始.然后在这里打印RT。