Regex 用空格重新格式化列表字符串
我有一个打印到控制台的字符串列表。我需要把它转换回带引号的字符串 假设示例文件如下所示Regex 用空格重新格式化列表字符串,regex,perl,awk,Regex,Perl,Awk,我有一个打印到控制台的字符串列表。我需要把它转换回带引号的字符串 假设示例文件如下所示 List(UT_LVL_17_CD, UT_LVL_20_CD, 2018 1Q, 2018 2Q, 2018 3Q, 2018 4Q, 2018 FY) List(UT_LVL_17_CD,UT_LVL_20_CD,2018 1Q,2018 2Q,018 3Q,2018 4Q,2018 FY) List( UT_LVL_17_CD, UT_LVL_20_CD,2018 1Q,2018 2Q, 2018
List(UT_LVL_17_CD, UT_LVL_20_CD, 2018 1Q, 2018 2Q, 2018 3Q, 2018 4Q, 2018 FY)
List(UT_LVL_17_CD,UT_LVL_20_CD,2018 1Q,2018 2Q,018 3Q,2018 4Q,2018 FY)
List( UT_LVL_17_CD, UT_LVL_20_CD,2018 1Q,2018 2Q, 2018 3Q, 2018 4Q, 2018 FY )
" UT_LVL_17_CD"
"UT_LVL_20_CD ",
对于上述所有3种组合,输出应为
List("UT_LVL_17_CD", "UT_LVL_20_CD", "2018 1Q", "2018 2Q", "2018 3Q", "2018 4Q", "2018 FY")
请注意,起点、终点或图元之间的间距是可以接受的
List( "UT_LVL_17_CD", "UT_LVL_20_CD", "2018 1Q", "2018 2Q", "2018 3Q", "2018 4Q", "2018 FY" )
但不在字符串值内,如下所示
List(UT_LVL_17_CD, UT_LVL_20_CD, 2018 1Q, 2018 2Q, 2018 3Q, 2018 4Q, 2018 FY)
List(UT_LVL_17_CD,UT_LVL_20_CD,2018 1Q,2018 2Q,018 3Q,2018 4Q,2018 FY)
List( UT_LVL_17_CD, UT_LVL_20_CD,2018 1Q,2018 2Q, 2018 3Q, 2018 4Q, 2018 FY )
" UT_LVL_17_CD"
"UT_LVL_20_CD ",
应保留每个元素中已有的空格“2018 4Q”
我正在尝试下面的方法,但无法得到正确的结果
$ perl -pe ' s/(?<=\()|(?=,)|(?=\))/\"/sg ' list.txt
List("UT_LVL_17_CD", UT_LVL_20_CD", 2018 1Q", 2018 2Q", 2018 3Q", 2018 4Q", 2018 FY")
List("UT_LVL_17_CD",UT_LVL_20_CD",2018 1Q",2018 2Q",018 3Q",2018 4Q",2018 FY")
List(" UT_LVL_17_CD", UT_LVL_20_CD",2018 1Q",2018 2Q", 2018 3Q", 2018 4Q", 2018 FY ")
$
$perl-pe的/(?试试这个
(?<=\(|,)\s*(.*?)\s*(?=\)|,)
(?查看以下各项是否适用于您:
[(,]\K\s*(.*?)\s*(?=[),])
在线查看
[(,]
-匹配逗号或开头
\K
-重置报告匹配的起点
\s*
-匹配零个或多个空格
(.*)
-第一个捕获组,用于捕获具有惰性量词的任何字符
\s*
-匹配零个或多个空格
(?=[),])
-正向前瞻以匹配逗号或结束语
根据链接的演示,替换为“\1”
另一个选项可以是使用\G
锚定并匹配单词字符,可以选择按空格和单词字符重复
(?:\G(?!^),|\bList\((?=[^()\r\n]*\)))\K\h*(\w+(?:\h+\w+)*)\h*
解释
(?:
非捕获组
\G(?!^),
在上一次匹配结束时断言位置,但不要在开始时断言位置(因为\G
可以在这两个位置匹配)
|
或
\bList\((?=[^()\r\n]*\)
单词边界,然后匹配列表(
并在同一行上断言结束)
)
关闭非捕获组
\K\h*
忘记目前匹配的内容(不删除匹配的列表(
和逗号),并匹配要删除的可选空格
(
Capturegroup 1
\w+(?:\h+\w+*
匹配1+个单词字符,可以选择按空格和单词字符重复
)\h*
关闭组1并匹配要删除的可选尾随空格
在替换中,在双引号之间使用组1
$perl-pne的/\(\s+/\(/;/([^(]+\()(.+)\)/;$\=“$1\”.连接(“\”,\”,拆分(/,\s*/,$2))。”\n“;”文件
列表(“UT_LVL_17_CD”、“UT_LVL_20_CD”、“2018年第一季度”、“2018年第二季度”、“2018年第三季度”、“2018年第四季度”、“2018财年”)
列表(“UT_LVL_17_CD”、“UT_LVL_20_CD”、“2018年第一季度”、“2018年第二季度”、“018年第三季度”、“2018年第四季度”、“2018财年”)
列表(“UT_LVL_17_CD”、“UT_LVL_20_CD”、“2018年第一季度”、“2018年第二季度”、“2018年第三季度”、“2018年第四季度”、“2018财年”)
输入测试文件:
$ cat file
List(UT_LVL_17_CD, UT_LVL_20_CD, 2018 1Q, 2018 2Q, 2018 3Q, 2018 4Q, 2018 FY)
List(UT_LVL_17_CD, UT_LVL_20_CD,2018 1Q,2018 2Q,018 3Q,2018 4Q,2018 FY)
List( UT_LVL_17_CD, UT_LVL_20_CD,2018 1Q,2018 2Q, 2018 3Q, 2018 4Q, 2018 FY )
OP提到前导/尾随空格是可以接受的…我认为这意味着去掉不必要的前导/尾随空格也是可以接受的
样本输入:
$ cat string.dat
List(UT_LVL_17_CD, UT_LVL_20_CD, 2018 1Q, 2018 2Q, 2018 3Q, 2018 4Q, 2018 FY)
List(UT_LVL_17_CD,UT_LVL_20_CD,2018 1Q,2018 2Q,018 3Q,2018 4Q,2018 FY)
List( UT_LVL_17_CD, UT_LVL_20_CD,2018 1Q,2018 2Q, 2018 3Q, 2018 4Q, 2018 FY )
一个不那么紧凑的awk
idea:
awk -F'[()]' ' # input field delimiters are "(" and ")"
{ printf "%s(", $1 # print field #1 + "("
n=split($2,a,",") # split field #2 by ",", save in array a[]
pfx="" # initial prefix is ""
for (i=1 ; i<=n ; i++) # loop through a[] elements
{ gsub(/^ *| *$/,"",a[i]) # strip leading/trailing spaces
printf "%s\"%s\"", pfx, a[i] # print prefix + current a[] element wrapped in double quotes
pfx="," # set prefix to "," for rest of a[] elements
}
printf ")\n" # print final ")"
}
' string.dat
同样的想法:@JvdV..是的,它很有效..你能把它添加为answer@JvdV..这只是一个临时工作。性能不是一个问题。最后一个值显示为“2018财年”
它应该是“2018财年”
@stack0114106已修复。除了简单地剥离映射中的前导/尾随空格之外,看不到任何更好的东西,稍后将再次查看…np.祝您愉快编辑:必须剥离映射中的尾随空格
--但随后可以将所有内容清除,因此删除了其他\s
是的..很有效..但发现很难o了解您有没有其他简单的例子来理解regex@stack0114106例如,您可以看到或[我尝试了这个问题的\G样式..您能看一下吗?..great..idea..初始清理后在/,\s*/
上拆分。。