This page is read only. You can view the source, but not change it. Ask your administrator if you think this is wrong. ====== 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. <code bash> echo bee | \ sed 's/\([a-z]\)/\u\1/' Bee </code> 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 <code bash> 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 </code> 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. <code bash> 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 </code> ==== Substitution ==== === N-th occurence === To substitute the second occurence of 'e' with '3' <code bash> $ echo 'hey there' | sed 's/e/3/2' hey th3re </code> Substitute every 'e' with '3' but first <code bash> $ echo 'hey there' | sed 's/e/3/2g' hey th3r3 </code> To substitute the third 'e' with '3' <code bash> $ echo 'hey there' | sed 's/e/3/3' hey ther3 </code> ==== Snippets ==== === Extract text from .docx documents === <code bash> unzip -p file.docx word/document.xml | \ sed -e 's/<\/w:p>/\n/g; s/<[^>]\{1,\}>//g; s/[^[:print:]\n]\{1,\}//g' </code> [[https://www.commandlinefu.com/commands/view/4311/extract-plain-text-from-ms-word-docx-files|CommandlineFU]] === Join every line in file to single line === <code> sed ':a; N; s/\n/ /; ta' <file> </code> - '':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