bash 或 sh - 将内容从一个文件移动到另一个文件或在 bash 或 sh 中编辑文件时,bahow 保护换行符和文件结构

问题描述 投票:0回答:1

我有这个文件

我有这个名为 filename 的文件,内容是

export k="multiline_v"

例如

export k="kdk=dkdk
kdkdkdk=kdkd
ldldldsgg"

另一个例子:

export k="-----BEGIN CERTIFICATE-----
MIIENjCCAx4CCQDQDy8tPglm1DANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQDDAJD
QTENMAsGA1UECwwEU1NDRTENMAsGA1UECgwEU1NOQzEPMA0GA1UEBwwGRFVSSEFN
AQELBQADggEBAHgkLaegFG5CemXZfSocsaR/4zSbTgefgCTusrArUJGMO+2CNQRP
5lK9bXaXykyX7lJGsdZbS13Vy9sdQQVj0icW70bagIwl/p8mXbTzTgDdtCPsJLN7
uOkQRS646rp4nVEmp86imAgGWL+sdBG9WPhYsD0ZeDd28B6XBVMfm1k5DfPR9r6E
iigSB0hbPIlEbVpHQNsuHdpbKqGLjm4mNCpxdqjSMDNt9VjJAdjrZb7eQjuai95F
Vy9bwizvXDoE2pPJ056gkBYLS7nhS277lgs9Z+oLDa0bRFxw27pvNPvkaDv5dtyd
b/F+NL/Fe738KoZ3FO69Fl6GnNZiMOP50gc=
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQDBi+FpwvWVTWbY
XN/zvjDJPOtffs3o6EuQAAhE5XAgfudar8gcojAegL9mU3owa5+s0w0Je9eWDkQt
XkxewcAfcKZ08vALmZhyI8w5+dJPTQqGug1aObF+W+hUezKr/l6nyfT8cbdP/gPT
Wp0wfm6yJUFaecUgYh8I3gvsJ5XaV5OHilNVzz53nYXCAdXmSyocwef51XWchJh0
EYKZzw0V6t0CLuCnbAcICjQ3GNP5HaZ8cfXkIGDqmTJM4UCDfAMG7mkv0O13+7uW
b9PnaQEZ175Aj27f+ke4w2q3Bd0BGNVkmc8bvqlL6Q9GUGJJcF6VSpNVNP/Royr+
yyOY18Zk20TB3wZC3RI4qh8eATkToHoEM+THRgsoUGesx4r4axWEz3Ud2NxN8elk
5O8ghWqmxnEdcXDtyA90Io7ZWRjP8pE=
-----END PRIVATE KEY-----"

我用这个来剪名字k

filename=myfile
key=$(head -n1 $filename | cut -d '=' -f 1 | cut -d ' ' -f 2)

然后我想要另一个名为 k 的文件,内容为 v ,不带“”

在上面的例子中,它会是

kdk=dkdk
kdkdkdk=kdkd
ldldldsgg

-----BEGIN CERTIFICATE-----
MIIENjCCAx4CCQDQDy8tPglm1DANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQDDAJD
QTENMAsGA1UECwwEU1NDRTENMAsGA1UECgwEU1NOQzEPMA0GA1UEBwwGRFVSSEFN
AQELBQADggEBAHgkLaegFG5CemXZfSocsaR/4zSbTgefgCTusrArUJGMO+2CNQRP
5lK9bXaXykyX7lJGsdZbS13Vy9sdQQVj0icW70bagIwl/p8mXbTzTgDdtCPsJLN7
uOkQRS646rp4nVEmp86imAgGWL+sdBG9WPhYsD0ZeDd28B6XBVMfm1k5DfPR9r6E
iigSB0hbPIlEbVpHQNsuHdpbKqGLjm4mNCpxdqjSMDNt9VjJAdjrZb7eQjuai95F
Vy9bwizvXDoE2pPJ056gkBYLS7nhS277lgs9Z+oLDa0bRFxw27pvNPvkaDv5dtyd
b/F+NL/Fe738KoZ3FO69Fl6GnNZiMOP50gc=
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQDBi+FpwvWVTWbY
XN/zvjDJPOtffs3o6EuQAAhE5XAgfudar8gcojAegL9mU3owa5+s0w0Je9eWDkQt
XkxewcAfcKZ08vALmZhyI8w5+dJPTQqGug1aObF+W+hUezKr/l6nyfT8cbdP/gPT
Wp0wfm6yJUFaecUgYh8I3gvsJ5XaV5OHilNVzz53nYXCAdXmSyocwef51XWchJh0
EYKZzw0V6t0CLuCnbAcICjQ3GNP5HaZ8cfXkIGDqmTJM4UCDfAMG7mkv0O13+7uW
b9PnaQEZ175Aj27f+ke4w2q3Bd0BGNVkmc8bvqlL6Q9GUGJJcF6VSpNVNP/Royr+
yyOY18Zk20TB3wZC3RI4qh8eATkToHoEM+THRgsoUGesx4r4axWEz3Ud2NxN8elk
5O8ghWqmxnEdcXDtyA90Io7ZWRjP8pE=
-----END PRIVATE KEY-----

如果我可以复制该文件并找到一个命令来就地执行此操作,那就太好了,因为该文件不会更改并且我想要保留的部分(第一行中第一个 = 符号的右侧以及所有除了最后一个“)之外的其他行将保持不变,我更愿意这样做。

我认为这是不可能的。这就是为什么我必须以某种方式复制和处理它。 如何做到一切都保持不变。

bash sh
1个回答
0
投票

这个Shellcheck干净的代码演示了一种可能的方法来完成你想要的事情:

#! /bin/sh -

filename=$1

sh -c ' fake_export()
        {
            printf "%s\\n" "${1#*=}" >"${1%%=*}"
        }

        alias export=fake_export

        . "$1"
    ' sh "$filename"

将其保存到文件(例如

myprog
),使其可执行(
chmod +x myprog
)并使用
./myprog ./myfile
进行测试(其中
myfile
包含
export k="...."
)。

© www.soinside.com 2019 - 2024. All rights reserved.