Shell 在unix中从文件中提取两个括号之间的文本
可能重复:Shell 在unix中从文件中提取两个括号之间的文本,shell,unix,Shell,Unix,可能重复: 我试图在unix中提取文件的两个括号之间的文本。像下面 abc( xyz, abc, mnr, puc, ) 我试着使用awk,比如: awk 'BEGIN {FS="abc"} {print $2}' file.txt 但这是行不通的 请在这方面帮助我 提前感谢您可以使用sed像这样“提取文本”: sed -n '/abc(/,/)/ { //d; /^\s*$/!p }' file 结果: xyz, abc, mnr, puc, xyz, abc, mnr, puc
我试图在unix中提取文件的两个括号之间的文本。像下面
abc(
xyz,
abc,
mnr,
puc,
)
我试着使用awk,比如:
awk 'BEGIN {FS="abc"} {print $2}' file.txt
但这是行不通的
请在这方面帮助我
提前感谢您可以使用
sed
像这样“提取文本”:
sed -n '/abc(/,/)/ { //d; /^\s*$/!p }' file
结果:
xyz,
abc,
mnr,
puc,
xyz,
abc,
mnr,
puc,
说明:
- 使用
开关禁用默认打印-n
- 使用“选择”两种模式之间的模式
和abc(
)
删除所选模式://d
和abc(
)
- 和
告诉sed打印除空行以外的任何内容/^\s*$/!p
或使用
awk
:
awk '/abc\(/ { r=""; f=1 } f && !/^(abc\(|\)|\s*)$/ { r = (r ? r ORS : "") $0 } /\)/ { if (f) print r; f=0 }' file
结果:
xyz,
abc,
mnr,
puc,
xyz,
abc,
mnr,
puc,
方式1:
如果在abc(
和之前)之后总是有空行
:
方式2:
如果您不确定是否有空行:
awk '/abc\($/{f=1;next;} /^ *\) *$/{f=0}f' file
注意,在方法2中,有些情况不起作用。例如,在abc(…)块中有嵌套的“
)
”行。但你可以测试一下。基于您问题中的给定输入。这两种方法都能工作。这很好,但我需要一个命令来提取文本。从shell脚本的角度来看,这些是单个命令。这些命令占用多个屏幕行,但这是纯人机界面。无论如何,将可接受的答案限制在单个命令是可疑的。为什么?使用GNUsed
它可以正常工作。您使用的是什么口味的sed
?一个更简单的解决方案是:sed-n'/abc(/,/)/{//d;/^$/!p}文件
。不确定这是否能解决你的问题。另外,您的错误消息是什么?你有吗?Steve我使用的是GNU sed版本4.1.2,它没有显示任何错误消息,并且在与()相同的文件中还有更多的行。我会发现缺少错误消息非常令人担忧-你安装的sed
可能会坏掉。我已经使用GNU sed版本4.2.1测试了上述内容,但它肯定可以与版本4.1.2一起使用。我不确定在我的unix中使用的sed是否已损坏。是否有其他方法获得输出?是的,工作正常。非常感谢您的帮助。在下面的块bc(xyz、abc、mnr、puc)之前有几行代码路1和路2不工作