【发布时间】:2011-06-24 16:41:45
【问题描述】:
我有一个这样的文件:
"text I don't know" command other "text"
"some" different text "type"
我需要使用 sed、awk 或任何 bash 工具获取“我不知道的文本”和“一些”,以通过管道传输到另一个命令。
有什么提示吗?
【问题讨论】:
-
从你的文件中举一个例子,一个小例子。还有,这是作业吗?
我有一个这样的文件:
"text I don't know" command other "text"
"some" different text "type"
我需要使用 sed、awk 或任何 bash 工具获取“我不知道的文本”和“一些”,以通过管道传输到另一个命令。
有什么提示吗?
【问题讨论】:
这似乎过于简单,这意味着您可能是 awk 的新手。这是完全可以接受的,或者我误解了你的问题。我希望是前者。
以下内容应满足您的要求。将字段分隔符设置为“-F\"”(用“转义”)并打印第二个字段,第一个字段在“”的左侧,或者什么都没有。你可以只放一个管道和行尾来做你想做的事.
awk -F\" '{print FS$2FS}' inputFile.txt
“我不知道的文字”
“一些”
FS 是字段分隔符
【讨论】:
awk =P,它确实非常有用,尤其是对于基本的文本操作。我强烈建议您花几分钟时间阅读它的功能,其中很多内容更容易学习。
sed 's/^\("[^"]*"\).*/\1/'
这处理包含简单双引号字段的行删除任何额外的材料。它通过任何不匹配不变的行。
如果你想删除不匹配的行,那么:
sed -n '/^\("[^"]*"\).*/s//\1/p'
默认情况下不打印,并在找到匹配项时打印。
如果必须处理数据字段如:
"He said, ""It's horrid""" and he meant it!
那么你必须更加努力地工作。如果您的sed 支持扩展正则表达式或 PCRE(Perl 兼容正则表达式),您可以这样做。如果没有,请改用awk。
【讨论】:
不确定" 是否应该是输出的一部分,假设不是。如果我弄错了,将它添加到输出中应该没有任何问题(故意将sed 排除在下面的列表之外,因为@Jonathan-Leffler 的答案非常好)
由于"作为第一个字符输出,这不是一个完美的解决方案,但它很简单。
cut -d\" -f1-2 input
使用纯bash的解决方案,IFS的解释见5.1 Bourne Shell Variables
#!/bin/bash
IFS='"'
while read -ra LINE;
do
echo ${LINE[1]}
done < input
使用 awk 和 -F 标志将分隔符更改为 " 的解决方案
$ awk -F\" '{print $2}' input
最后是 perl 中的一个。 -a 开启自动拆分模式——perl 会自动将空格上的输入行拆分到 @F 数组中。 -F 与 -a 结合使用,用于选择分割行的分隔符。
perl -F\" -lane 'print $F[1]' input
【讨论】: