====== Sed ====== {{htmlmetatags>metatag-robots=(follow, index) metatag-keywords=(bsd,editor,editors,gnu,linux,regex,regexp,regular expression,sed,unix) metatag-description=(Text editing tools, real life examples, *BSD, GNU/linux, linux) }} {{tag>editing editor regex text}} [[.:|{{mdi>arrow-left-circle}}]] ===== GNU/sed ===== ==== Case transformation ==== GNU/sed has got the functionality to transform upper-case letters to lower-case letters and vice-versa. Such a transformation can be applied to single letters, or from a start point to an end point. echo bee | \ sed 's/\([a-z]\)/\u\1/' Bee In the example above you see that the first letter matched by the character class '[a-z]' was 'b' and got translated to its upper-case counterpart 'B' by **\u**. The translation from upper-case to lower-case works the same way but instead with **\l**. The translation of the first letter of every word to upper-case could be done with echo 'hi this is the sed way of case transformation' | \ sed 's/\b\([a-z]\)/\u\1/g' Hi This Is The Sed Way Of Case Transformation Another way is to define a start point and an end point. To start a continuous transformation to upper-case you have to use **\U** instead of **\u** as start point. It ends at the **\E** or at the **\L** wich would start a transformation to lower-case from that point. echo 'hi this is the sed way of case transformation' | \ sed 's/^\([^t]\+\)\(t[^s]\+s\)\(.*\)/\1\U\2\E\3/' hi THIS is the sed way of case transformation ==== Substitution ==== === N-th occurence === To substitute the second occurence of 'e' with '3' $ echo 'hey there' | sed 's/e/3/2' hey th3re Substitute every 'e' with '3' but first $ echo 'hey there' | sed 's/e/3/2g' hey th3r3 To substitute the third 'e' with '3' $ echo 'hey there' | sed 's/e/3/3' hey ther3 ==== Snippets ==== === Extract text from .docx documents === unzip -p file.docx word/document.xml | \ sed -e 's/<\/w:p>/\n/g; s/<[^>]\{1,\}>//g; s/[^[:print:]\n]\{1,\}//g' [[https://www.commandlinefu.com/commands/view/4311/extract-plain-text-from-ms-word-docx-files|CommandlineFU]] === Join every line in file to single line === sed ':a; N; s/\n/ /; ta' - '':a'' puts a label. - ''N'' appends the next line into pattern space (which contains the current line) - ''s/\n/ /'' substitues the newline character with a space character - ''ta'' jumps to label ''a'' if it's previous command ends successfully https://askubuntu.com/questions/164056/how-do-i-combine-all-lines-in-a-text-file-into-a-single-line/996766#996766