Sed: Difference between revisions

From NovaOrdis Knowledge Base
Jump to navigation Jump to search
Line 26: Line 26:
<pre>
<pre>
cat ${f} | sed -e ${n}'s/$/this text will be appended at line number, and this '"${variable}"' will be substituted\n' > ${dest}
cat ${f} | sed -e ${n}'s/$/this text will be appended at line number, and this '"${variable}"' will be substituted\n' > ${dest}
</pre>
=Insert Multiple Lines at a Specific Position in a File=
Use the above recipe, and in the last phase, use:
<pre>
cat ${f} | sed -e ${n}'a\
blah\
blah\
blah with variable substitution, etc' > ${dest}
</pre>
</pre>



Revision as of 07:04, 17 February 2016

Internal

Insert a Line/Append in a Specific Position (line number) in a file

Figure out the line number:

# determine the last line that contains ^JAVA_OPTS
local n
n=$(cat ${f} | grep -n "^JAVA_OPTS=" | tail -1) || { echo "failed to determine the line number" 1>&2; exit 1; }
n=${n%%:*}

Insert a line at line 'n':

# insert at line "n":
cat ${f} | sed -e ${n}'a\
This line will be inserted at line number '"${n}"', and this '"${variable}"' will be substituted' > ${dest}

To append at a specific line number, determine the line number as before and effectively "substitute" (s) the line end with your addition:

cat ${f} | sed -e ${n}'s/$/this text will be appended at line number, and this '"${variable}"' will be substituted\n' > ${dest}

Insert Multiple Lines at a Specific Position in a File

Use the above recipe, and in the last phase, use:

cat ${f} | sed -e ${n}'a\
blah\
blah\
blah with variable substitution, etc' > ${dest}

Special Characters (need to be escaped in regular expressions)

     /
     "
     $ # unescaped signifies end of line 

Non-Special Characters (do not need to be escaped in regular expressions)

     <
     >
     (
     )
     !
     -

Deleting with sed

Delete a Line that Matches a Certain Pattern

sed will delete a line identified by line number or if the line matches a regular expression pattern:

sed '{<n>|/<regex>/}d' <file-name>

where:

  • n is the 1-based line number.
  • /<regex>/ is the pattern.

Examples:

Delete the third line of the file

sed '3d' a.txt > b.txt

Delete all lines that match a certain pattern

sed '/b..h/d' a.txt > b.txt

Delete the last line

sed '$d' a.txt > b.txt

Delete Lines Between Certain "Addresses"

sed '<n1>,<n2>d' <file-name>
sed '/<regex1/,/regex2/d' <file-name>

The addresses can be line numbers or regular expressions. Line numbers are 1-based.

Examples:

Delete all lines between line 2 and line 5 (inclusively)

sed '2,5d' a.txt > b.txt

Delete all lines between the occurrences of two regular expressions

sed '/red/,/blue/d' a.txt > b.txt

Delete Negation

sed can be used to delete all lines that do not match a certain pattern.

sed '/<regex>/!d' <file-name>