Bash 中的多个 sed 命令

3th*_*1ll 5 linux bash sed

我有一个 JSON 格式的文件用户名和密码,我想将其转换为进程。

我使用sed了不同的命令来处理它,但我想知道的是如何将所有三个命令合并为一个以备将来使用。

原始格式

    { "user.name1" : "hashed_password",
"user.name2" : "hashed_password" }
Run Code Online (Sandbox Code Playgroud)

期望输出

user.name:hashed_password
Run Code Online (Sandbox Code Playgroud)

这些是我运行的命令,但是我无法使用管道将它们链接在一起,或者只是在出现错误的地方将它们连接起来,sed: -e expression #1, char 8: unknown option to 's'.

违规命令...

sed -i 's/\"//g/s/\,/\n/g/\s//g' input_file 
sed: -e expression #1, char 8: unknown option to `s'
Run Code Online (Sandbox Code Playgroud)

如何将以下命令连接为一个?

命令删除双引号

sed -i 's/\"//g' input_file

用新行替换逗号

sed -i 's/\,/\n/g' input_file

删除空格

sed -i 's/\s//g input_file

Att*_*tie 18

要将多个sed命令放在一个“脚本”中,您可以使用多个-e标志(这是可移植的):

sed -i -e 's/\"//g' -e 's/\,/\n/g' -e 's/\s//g' input_file
Run Code Online (Sandbox Code Playgroud)

或分号分隔符(并非在所有实现中都可用):

sed -i 's/\"//g;s/\,/\n/g;s/\s//g' input_file
Run Code Online (Sandbox Code Playgroud)

您还需要为大括号添加处理 - {}...


话虽如此,为了正确解析和处理 JSON,您不应该真正使用sed......也许尝试jq

jq -r 'keys[] as $k | "\($k):\(.[$k])"' input_file
Run Code Online (Sandbox Code Playgroud)

输出:

user.name1:hashed_password
user.name2:hashed_password
Run Code Online (Sandbox Code Playgroud)
  • keys[] as $k 将遍历存储其值的每个键 $k
    • 即:user.name1user.name2
  • "\($k):\(.[$k])"将形成一个字符串,代入$k.[$k]
  • 使用-r从输出字符串中删除引号(原始模式)

使用sed来处理 JSON 会让您面临各种问题……例如,您将如何处理以下(完全有效的 JSON)输入?

{
    "user.name1" :
        "hashed_password",
    "user.name2" :
        "hashed_password"
}
Run Code Online (Sandbox Code Playgroud)