CSC 282.01, Class 13: A Unix Miscellany
Overview
- Preliminaries
- Questions
- A problem
- Refresher: Selecting files
- Backticks
- Refresher: Shell variables
- The joy of sed
- Regular expressions
- Refresher: Loops
- Command-line history
Good things to do
- Today’s CS Extra! (Science 2022)
A problem
Used CamelCase rather than snake_style for field names.
Problem: Want to take every appropriate file (except db, which needs
migration) and change TranslationLanguage to translation_language.
- Subproblem 1: How do I identify groups of files, not all of which are in the same directory?
- Subproblem 2: How do I transmit that list of files to another program to work with?
- Subproblem 3: How do I do the editing/modification efficiently?
Refresher: Selecting files
*.txtmeans all the files that end with txtgrep -l PATTERN *.txtmeans all the files with PATTERN in their bodiesfind . -name "*.txt" -print
Backticks
vi `find . -name "*.txt" -print`
Captures the output of one command, lets you use it as the command-line parameters to another command.
Refresher: Shell variables
name="Sam"
var="Hello $name"
echo $var
Most shell variables are only available to the shell, and not to subprocesses.
export var
export var=VALUE
makes the variable available to subprocesses.
We can use backticks with shell variables.
name=`command`
Detour: Substitution expressions in vi
- First instance on each line:
:1,$s/Hello/Hi/ - Instance at the left margin on each line:
:1,$s/^Hello/Hi/ - All instances on each line:
:1,$s/Hello/Hi/g
The joy of sed
sed - Stream editor
sed -e "s/Hello/Hi" file > newfile
Note that he default behavior of sed is to keep the original file
unchanged and send the modified version to stdout.
You can add -i for in-place, at least in GNU sed.
Regular expressions
This is the sed syntax, or parts thereof
- Most characters (except special characters, like ) match themselves
amatches the letter a3matches the character 3
^matches the start of line$matches the end of the line\^matches the caret character\\matches the backslash character.matches any one character[abc]matches any one character in the group within the brackets[a-z]matches any lowercase letter. (ASCII ranges)*matches zero or more copies of the previous regular expressiona*is zero or more a’saa*is one or more a’s
\(and\)serve the same role as parentheses in arithmetic\(aa\)*matches even numbers of a’s
- In the replacement,
\1is the first parenthesized expression,\2is the second, and so on and so forth
To duplicate any single letter that happens after H
s/H\(.\)/H\1\1/g
Refresher: Loops
for VAR in LIST; do
COMMAND
done
while (TEST) do
COMMAND
done
To rename all of my files that contain the word “Sam” to end with .sam
rather than .txt.
for file in `grep -l Sam *.txt`; do
newfile=`echo $file | sed -e 's/txt$/sam/'`
mv $file $newfile
done
Sam’s favorite use of while: Track the status of downloads
while (1) do
date
ls -l FILE
sleep 60
done