Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 在unix中从文件中提取两个括号之间的文本_Shell_Unix - Fatal编程技术网

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(
  • /^\s*$/!p
    告诉sed打印除空行以外的任何内容

或使用
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脚本的角度来看,这些是单个命令。这些命令占用多个屏幕行,但这是纯人机界面。无论如何,将可接受的答案限制在单个命令是可疑的。为什么?使用GNU
sed
它可以正常工作。您使用的是什么口味的
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不工作