替换行shell脚本中的特定字符

时间:2017-11-08 02:55:35

标签: bash shell unix sed

我在文件中有以下内容

{"Hi","Hello","unix":["five","six"]}

我想将方括号内的逗号替换为半冒号。不应该更改该行中的其余逗号。

输出应为

{"Hi","Hello","unix":["five";"six"]}

我尝试过使用sed但它无法正常工作。以下是我试过的命令。请帮助。

sed 's/:\[*\,*\]/;/'

由于

3 个答案:

答案 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允许替换多次发生。