我在文件中有以下内容
{"Hi","Hello","unix":["five","six"]}
我想将方括号内的逗号替换为半冒号。不应该更改该行中的其余逗号。
输出应为
{"Hi","Hello","unix":["five";"six"]}
我尝试过使用sed但它无法正常工作。以下是我试过的命令。请帮助。
sed 's/:\[*\,*\]/;/'
由于
答案 0 :(得分:2)
如果您的Input_file与显示的示例相同,则以下内容可能对您有帮助。
sed 's/\([^[]*\)\([^,]*\),\(.*\)/\1\2;\3/g' Input_file
输出如下。
{"Hi","Hello","unix":["five";"six"]}
编辑: 现在也添加相同的解释,它只应用于解释目的,只应在代码上方运行以获取输出。
sed 's/\([^[]*\)\([^,]*\),\(.*\)/\1\2;\3/g' Input_file
s ##is for substitution in sed.
\([^[]*\) ##Creating the first memory hold which will have the contents from starting to before first occurrence of [ and will be obtained by 1 later in code.
\([^,]*\) ##creating second memory hold which will have everything from [(till where it stopped yesterday) to first occurrence of ,
, ##Putting , here in the line of Input_file.
\(.*\) ##creating third memory hold which will have everything after ,(comma) to till end of current line.
/\1\2;\3/g ##Now mentioning the memory hold by their number \1\2;\3/g so point to be noted here between \2 and \3 have out ;(semi colon) as per OP's request it needed semi colon in place of comma.
答案 1 :(得分:1)
Awk在这里也很有用
awk -F'[][]' '{gsub(/,/,";",$2); print $1"["$2"]"$3}' file
使用gsub
,您可以替换特定字段中匹配符号的所有匹配项
输入文件
{"Hi","Hello","unix":["five","six"]}
{"Hi","Hello","unix":["five","six","seven","eight"]}
<强>输出强>
{"Hi","Hello","unix":["five";"six"]}
{"Hi","Hello","unix":["five";"six";"seven";"eight"]}
答案 2 :(得分:0)
你绝对应该使用RavinderSingh13的答案而不是我的答案(考虑到非常复杂的输入,它不太可能破坏或表现出意想不到的行为)但是这里的答案不那么健壮。比他更容易解释:
sed -r 's/(:\[.*),(.*\])/\1;\2/g' test
()
是一个捕获组。你可以看到搜索中有两个。在替换中,它们被称为\1
和\2
。这允许您将搜索块放回替换表达式中。 -r
使(
和)
不需要使用反斜杠进行转义。 [
和]
是特殊的,需要进行转义才能进行字面解释。哦,你希望.*
不是*
。 *
是一个glob
,在bash和其他shell中的某些地方使用,但仅在正则表达式中使用。
编辑:/g
允许替换多次发生。