Search code examples
bashsh

bash or sh - bahow preserver line break and file structure when moving content from one file to another or edit the file in bash or sh


I have this file

I have this file named filename and the content is

export k="multiline_v"

for example

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

another example:

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-----"

I use this to cut the name k

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

Then I want to have another file named k and the content be v without ""

In the examples above it is gonna be

kdk=dkdk
kdkdkdk=kdkd
ldldldsgg

and

-----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-----

If I could copy the file and find a command to do it in place, it would be great because the file would not change and the part I want to keep (the right side of the first = sign in the first line and all the other lines except the last ") would remain untouched, I would prefer to do this.

I think it is not possible. That is why I have to somehow copy and process it. How to do it such that everything stays untouched.


Solution

  • Input:

    $ cat f1
    export k="kdk=dkdk
    kdkdkdk=kdkd
    ldldldsgg"
    

    Three easy steps:

    IFS='=' read -r exp_var stuff < f1                  # read 1st line, use '=' as delimiter;
                                                        # place first field in variable 'exp_var';
                                                        # place rest of line in variable 'stuff'
    
    fname="${exp_var#* }"                               # strip off leading 'export ' leaving 'k'
    
    sed '1s/^[^"]*"//; $s/"[^"]*$//' f1 > "${fname}"    # 1s == 1st line, strip off everything up to first '"'
                                                        # $s == last line, strip off last '"' and anything after it (eg, white space, \r)
    

    This generates:

    $ cat k
    kdk=dkdk
    kdkdkdk=kdkd
    ldldldsgg
    

    Assuming file f1 is OP's original certificate file the above 3-lines of code generate:

    $ cat 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-----