我有如下文字:
select {{112,department}},{{112,client}},{{112,place}} from table where id=1 and {{112,cgid}} and {{113,evid}}
我需要写入一个文件
{{112,department}}
{{112,client}}
{{112,place}}
{{112,cgid}}
{{113,evid}}
每个项目都在自己的行上。
我尝试过,awk -F '[{}]' '{print $2}'
但它仅打印第一次出现的情况,并且仅打印不带{}
.添加后缀和前缀{}
会出现语法错误?
附加要求
- 在查询中替换为使用and
{{va1,val2}}
查询表后得到的单个值。val1
val2
答案1
或者使用sed
:
sed 's/select //;s/ from[^}]* //;s/},{/}\n{/g;s/}}{{/}}\n{{/g;s/\s*and\s*/\n/g'
例子
$ echo 'select {{112,department}},{{112,client}},{{112,place}} from table where id=1 and {{112,cgid}} and {{113,evid}' | \
sed 's/select //;s/ from[^{]*//;s/},{/}\n{/g;s/}}{{/}}\n{{/g;s/\s*and\s*/\n/g'
{{112,department}}
{{112,client}}
{{112,place}}
{{112,cgid}}
{{113,evid}
怎么运行的:
s/select //;
-select
从头开始删除s/ from[^{]*//;
- 删除从上到下from.*
的第一个{
s/},{/}\n{/g;
- 将所有转换},{
为}\n{
s/}}{{/}}\n{{/g;
- 将所有转换}}{{
为}}\n{{
s/\s*and\s*/\n/g'
- 将所有转换and
为\n
答案2
你可以使用grep命令,在手册页中您会发现:
grep 在每个文件中搜索模式。 FILE “-”代表标准输入。如果未给出 FILE,则递归搜索将检查工作目录,非递归搜索将读取标准输入。默认情况下,grep 打印匹配的行。
-o, --only-matching 仅打印匹配行的匹配(非空)部分,每个此类部分位于单独的输出行上。
-e PATTERN, --regexp=PATTERN 使用 PATTERN 作为模式。如果多次使用此选项或与 -f (--file) 选项结合使用,则搜索给定的所有模式。该选项可用于保护以“-”开头的模式。
对于你的问题:
echo 'select {{112,department}},{{112,client}},{{112,place}} from table where id=1 and {{112,cgid}} and {{113,evid}}' | grep -o -e "{\{2\}[^{]*}\{2\}"
{\{2\}
方法{符号恰好出现两次。[^{]*
表示任何时候的任何字符,除了{。}\{2\}
方法}符号恰好出现两次。
结果将:
{{112,department}}
{{112,client}}
{{112,place}}
{{112,cgid}}
{{113,evid}}
答案3
这个怎么样。将字段 2 中的每个“},”替换为“}”,然后打印字段 2。
awk '{gsub(/},/,"} ",$2);print $2}' file
或者在sed
.删除“select”和“from”之间的文本,并将每个“},”替换为“}”。
sed 's/^select \({.*}\) from .*/\1/;s/},/} /g' file
答案4
我会使用grep
而不是awk
.这里-P
标志要求grep
使用 PCRE 正则表达式而不是默认的(以便.*?
匹配尽可能少),并且该-o
标志grep
只打印匹配的组件:
grep -Po '{{.*?}}'
例子:
grep -Po '{{.*?}}' <<<'select {{112,department}},{{112,client}},{{112,place}} from table where id=1 and {{112,cgid}} and {{113,evid}}'
{{112,department}}
{{112,client}}
{{112,place}}
{{112,cgid}}
{{113,evid}}
您的查询中没有{{va1,val2}}
匹配的内容,因此“附加要求”没有实际意义。或者您是否泛化到匹配的实体,例如{{112,department}}
?如果是这样,您需要解释要做什么,因为将查询中的[它们]替换为我将在[稍后]得到的单个值这个要求太宽泛,无法用显式代码来解决。