将多个 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。
我有一个文件 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
.
怎么样
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。