linux 使用分隔符创建解析器脚本

polkgigr  于 2022-12-29  发布在  Linux
关注(0)|答案(9)|浏览(159)

我正在尝试将此输入从file.txt转换为

a,b;c^d"e}
f;g,h!;i8j-

到这个输出中

a,b,c,d,e,f,g,h,i,j

带awk
目前为止我做得最好的是
awk '$1=$1' FS="[!;^}8-]" OFS="," file.txt
1.如何避免将"解释为特殊字符?"不起作用
1.避免输出中出现重复的,,,并删除最后一个,

31moq8wy

31moq8wy1#

我将按照以下方式利用GNU AWK完成此任务,让file.txt内容

a,b;c^d"e} f;g,h!;i8j-

那么

awk 'BEGIN{FPAT="[a-z]";OFS=","}{$1=$1;print}' file.txt

给出输出

a,b,c,d,e,f,g,h,i,j

说明:我使用FPAT通知GNU AWK字段是单个小写ASCII字母,并且输出字段分隔符(OFS)是,,然后对于每一行,我执行$1=$1以触发行重建和print行。

  • (在GNU Awk 5.0.1中测试)*
pzfprimi

pzfprimi2#

如果您只想用逗号替换非字母字符并压缩重复的逗号,那么tr是您的好选择:

tr -sc '[:alpha:]' ','

不过这会留下一个逗号,你可以使用sed来删除/替换它:

tr -sc '[:alpha:]' ',' | sed 's/,$/\n/'

另一种可能性是将每个“项目”拆分为自己的行(使用trgrep -o),然后使用paste再次合并行:

tr -sc '[:alpha:]' '\n' | paste -sd,
avkwfej4

avkwfej43#

使用任何POSIX awk并假设您希望任何非字母字符充当字段分隔符:

$ awk -F '[^[:alpha:]]+' -v OFS=',' '{printf "%s", p; $1=$1; p=$0} END{sub(OFS"$","",p); print p}' file
a,b,c,d,e,f,g,h,i,j

如果您真的只想使用问题中的特定字符集作为字段分隔符,则只需将[^[:alpha:]]+更改为[!;^}8"-]+

093gszye

093gszye4#

awk中的一个(不是所有awk都有,在gawk,mawk,busybox awk和Macos awk版本20200816中测试成功,在Debian的awk版本20121220(又名original-awk)中测试失败。

$ awk -v RS="^$" '{      # read whole file in 
    gsub(/[^a-z]+/,",")  # replace all non lowercase alphabet substrings with a comma
    sub(/,$/,"")         # remove trailing comma
}1' file                 # output

输出:

a,b,c,d,e,f,g,h,i,j
chhkpiq4

chhkpiq45#

ed是否可用/可接受。
script.ed

%s/[^a-z]/ /g
%s/[[:blank:]]\{1,\}/,/g
g/./;j\
s/,$//
,p
Q

现在快跑

ed -s file.txt < script.ed
drkbr07n

drkbr07n6#

KISS

$ grep -o '[a-z]' file | paste -sd ',' -
a,b,c,d,e,f,g,h,i,j

应该适用于大多数GNU/Linux,甚至busyboxfreeBSD-是强制性的)

sgtfey8w

sgtfey8w7#

使用gnu-sed将a-z以外的1个或多个字符替换为逗号,然后删除所有前导和尾随逗号

sed -Ez 's/[^a-z]+/,/g; s/^,+|,+$//' file

产出

a,b,c,d,e,f,g,h,i,j
fhity93d

fhity93d8#

echo "${input_data}" |
mawk 'NF-=_==$NF' FS='[^[:alpha:]]*' OFS=, RS=
a,b,c,d,e,f,g,h,i,j

如果有可能出现前缘分离,请使用以下代码:
一个一个三个一个一个一个一个一个四个一个一个一个一个一个五个一个

    • 附注:请注意,nawk对它所认为的[[:alpha:]]有一个非传统的定义:
reparse <[[:alpha:]]+>

cclenter   : in = | . .. |, out = 
   
|ABCDEFGHIJKLMNOPQRSTUVWXYZ
 abcdefghijklmnopqrstuvwxyz
 ªµºÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ
   ßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ|

即使locale设置为LANG="en_US.UTF-8"nawk[[:alpha:]]的想法既不是ASCII,也不是完整的Unicode-
ISO-8859-...等传统8位语言环境类似,但不必完全相同

hof1towb

hof1towb9#

如果您对Perl解决方案没问题,这里有一行代码;

perl -ne '$_ =~ s/[^[:alnum:]]//g; print join(",", split//, $_)'

其输出:

a,b,c,d,ef,g,h,i,8,j

简单地说,您是在用空字符替换非字母数字字符。

相关问题