Escape a path for sed search pattern [duplicate] - regex

This question already has answers here:
Closed 10 years ago.
Possible Duplicate:
sed, foward slash in quotes
In my bash script I have a path string, which I should use in sed pattern.
SRC_PATH="$PWD"
sed "s/<SRC_PATH>/$SRC_PATH/g" template.sh > replaced.sh
How can I escape the $SRC_PATH string so it would be safely accepted by sed as a literal replacement?

You need not escape it. Just use other delimiter:
sed "s#<SRC_PATH>#$SRC_PATH#g" template.sh > replaced.sh
But you must be sure that SRC_PATH contains no # (or other symbol if you choose it).

Use s%$OLDPATH%$NEWPATH%. You can choose your delimiter. If % is too dangerous, consider Control-A instead.

Related

Regular expression not matching correctly in sed command [duplicate]

This question already has answers here:
Why doesn't `\d` work in regular expressions in sed? [duplicate]
(3 answers)
Closed 5 years ago.
I am trying to replace some character strings using sed in batch console. My input consists in a file with lines like these:
$ head qiimetax_sorted.txt
A61579.1.1437
D_0__Bacteria;D_1__Thermotogae;D_2__Thermotogae;D_3__Thermotogales;
D_4__Fervidobacteriaceae;D_5__Fervidobacterium;Ambiguous_taxa;D_7__;
D_8__;D_9__;D_10__;D_11__;D_12__;D_13__;D_14__
AAAA02020712.626.2096
D_0__Bacteria;D_1__Proteobacteria;D_2__Alphaproteobacteria;D_3__Rhizobiales;
D_4__Bradyrhizobiaceae;D_5__uncultured;D_6__Oryza sativa
Indica Group (long-grained rice);D_7__;D_8__;D_9__;D_10__;D_11__;D_12__;
D_13__;D_14__
Now I'm trying to erase the 'D_number__' string before the names with this sed command and it is not replacing anything:
sed -r 's/D_\d+__//g' qiimetax_sorted.txt > qiimesed.txt
Any idea of which is the problem?
Thanks!
Your regex syntax is perl like.
So if you want to keep it :
perl -pe 's/D_\d+__//g' qiimetax_sorted.txt > qiimesed.tx
or with sed :
sed -r 's/D_[0-9]+__//g' qiimetax_sorted.txt > qiimesed.tx

Bash - How to replace line that includes '/' characters [duplicate]

This question already has answers here:
sed search and replace strings containing / [duplicate]
(2 answers)
Closed 7 years ago.
I'm trying to replace a line in a csv file that includes '/' characters in one of its columns. Is there a way to replace it with sed? I'm using two variables: one to store the line to replace and another one for the string that will replace it.
sed -i "/s/${CURRENTLINE}/${NEWLINE}/g"
example of the line format:
907;name;2015;4444;DOC;44;user;06/03/2015
Thanks in advance!
Your sed command starts with s and you can use an alternate reges delimiter:
sed -i "s~${CURRENTLINE}~${NEWLINE}~g" file.csv

Replace string variable with string variable using Sed [duplicate]

This question already has answers here:
"sed" special characters handling
(3 answers)
Is it possible to escape regex metacharacters reliably with sed
(4 answers)
Escape a string for a sed replace pattern
(17 answers)
Closed 5 years ago.
I have a file called ethernet containing multiple lines. I have saved one of these lines as a variable called old_line. The contents of this variable looks like this:
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="2r:11:89:89:9g:ah", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"
I have created a second variable called new_line that is similar to old_line but with some modifications in the text.
I want to substitute the contents of old_line with the contents of new_line using sed. So far I have the following, but it doesn't work:
sed -i "s/${old_line}/${new_line}/g" ethernet
You need to escape your oldline so that it contains no regex special characters, luckily this can be done with sed.
old_line=$(echo "${old_line}" | sed -e 's/[]$.*[\^]/\\&/g' )
sed -i -e "s/${old_line}/${new_line}/g" ethernet
Since ${old_line} contains many regex special metacharacters like *, ? etc therefore your sed is failing.
Use this awk command instead that uses no regex:
awk -v old="$old_line" -v new="$new_line" 'p=index($0, old) {
print substr($0, 1, p-1) new substr($0, p+length(old)) }' ethernet

Matching pattern containing parentheses with sed [duplicate]

This question already has answers here:
Whether to escape ( and ) in regex using GNU sed
(4 answers)
Closed 4 years ago.
I need to insert '--' at the beginning of the line if line contains word VARCHAR(1000)
Sample of my file is:
TRIM(CAST("AP_RQ_MSG_TYPE_ID" AS NVARCHAR(1000))) AP_RQ_MSG_TYPE_ID,
TRIM(CAST("AP_RQ_PROCESSING_CD" AS NVARCHAR(1000)))
AP_RQ_PROCESSING_CD, TRIM(CAST("AP_RQ_ACQ_INST_ID" AS NVARCHAR(11)))
AP_RQ_ACQ_INST_ID, TRIM(CAST("AP_RQ_LOCAL_TXN_TIME" AS NVARCHAR(10)))
AP_RQ_LOCAL_TXN_TIME, TRIM(CAST("AP_RQ_LOCAL_TXN_DATE" AS
NVARCHAR(10))) AP_RQ_LOCAL_TXN_DATE, TRIM(CAST("AP_RQ_RETAILER" AS
NVARCHAR(11))) AP_RQ_RETAILER,
I used this command
sed 's/\(^.*VARCHAR\(1000\).*$\)/--\1/I' *.sql
But the result is not as expected.
Does anyone have idea what am I doing wrong?
this should do:
sed 's/.*VARCHAR(1000).*/--&/' file
The problem in your sed command is at the regex part. By default sed uses BRE, which means, the ( and ) (wrapping the 1000) are just literal brackets, you should not escape them, or you gave them special meaning: regex grouping.
The first and last (..) you have escaped, there you did right, if you want to reference it later by \1. so your problem is escape or not escape. :)
Use the following sed command:
sed '/VARCHAR(1000)/ s/.*/--\0/' *.sql
The s command appplies to all lines containing VARCHAR(1000). It then replaces the whole line .* by itself \0 with -- in front.
Through awk,
awk '/VARCHAR\(1000\)/ {sub (/^/,"--")}1' infile > outfile

Just give me the words between the "" [duplicate]

This question already has answers here:
Getting values between quotes
(2 answers)
Closed 9 years ago.
I have text lines like this
blahblah"word1"blahblah"word2"blahblah"word3"
I only want the text between the quotes and without the quotes. I could do an awk and us the " as a separator. And then get every second match. However, is there any way I can just use awk (or another command) to return words between sets of quotes? so I'd get back word1, word2, word3?
Thanks,
Here you go:
echo 'blahblah"word1"blahblah"word2"blahblah"word3"' | perl -ne 'print map("$_\n", m/"([^"]*)"/g)'
Depends which language you're using, but the regular expression to do this would be:
(?<=^(("[^"]*){2})*")[^"]+(?=")
That example will match everything between "s. if you want it to match only words between "s, use:
(?<=^(("[^"]*){2})*")\b+(?=")
The main difference is with the second example, spaces and most special characters will not be allowed. With the first example, all characters except for "s will be allowed between the "s. That includes new lines.
Non-robust, but fun:
sed -E 's/(^|")[^"]*("|$)/ /g'