简体   繁体   中英

Using bash to find text between strings and replace text in found string

I have a(n R Markdown) script that contains plain text, plus delimited chunks of bash code that look like this:

```{bash, title-of-chunk, other=TRUE, options=FALSE}
# here's some bash code
blah_blah="blah"
```

I would like to extract all of the bash code chunks into a separate document. The rub is that I would like the different code chunks to be labeled by a comment title-of-chunk . So the result would look like

# title-of-chunk
# here's some bash code
blah_blah="blah"

The chunk title will always be between the first two . 's. I've been working with sed , but haven't found the right combination yet.

awk '$0 ~ /^```$/ {p=0} 
     $1 ~ /^```{bash/ {p=1; print "\n# " substr($2,1,length($2)-1); next}
     p' file >  output

I have extended your sample input:

> cat file
blah blah

```{bash, title-of-chunk, other=TRUE, options=FALSE}
# here's some bash code
blah_blah="blah"
```
blah
blah

```{python, test}
# here's some python code
blah_blah="blah"
```

test

```{bash, exit, other=TRUE, options=FALSE}
# here's some bash code
exit 0
```

Output:

> cat output

# title-of-chunk
# here's some bash code
blah_blah="blah"

# exit
# here's some bash code
exit 0

Based on shown samples only, could you please try following once. Written and tested on site https://ideone.com/iybsWx

awk '
/^```/{
  found=""
}
match($0,/^```{.*title-of-chunk/){
   val=substr($0,RSTART,RLENGTH)
   sub(/.*title/,"title",val)
   print "#"val
   val=""
   found=1
   next
}
found
'  Input_file

Explanation: Adding detailed explanation for above.

awk '                                       ##Starting awk program from here.
/^```/{                                     ##Checking condition if line has ``` then do following.
  found=""                                  ##Nullify found here.
}
match($0,/^```{.*title-of-chunk/){          ##Using match function to match ```{bash till title-of-chunk then do following.
   val=substr($0,RSTART,RLENGTH)            ##Sub-string of matched regex output is being saved in variable here.
   sub(/.*title/,"title",val)               ##Substituting everything till title with title in in val.
   print "#"val                             ##Printing # and val here.
   val=""                                   ##Nullifying val here.
   found=1                                  ##Setting found to 1 here.
   next                                     ##next will skip all further statements from here.
}
found                                       ##Checking condition if found is SET then print the current line.
'  Input_file                               ##Mentioning Input_file name here.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM