How can I delete a fixed part of some lines from a text file?
parsing the output of ls
is unreliable, but this should work in this particular case:
sed -e 's/^.*emma emma //' file
That deletes everything up to "emma emma " on each line. if that string doesn't appear on a line, it is unchanged.
I've written the regexp to only remove the first space after emma, so that the size field remains right-aligned (e.g. ' 709K' and '1007K' both take the same amount of chars on the line)
if you don't wan't that, use this instead:
sed -e 's/^.*emma emma *//' file
that will delete all whitespace after emma until the start of the next field.
Here's a sed version that works with any user group
:
sed -e 's/^.\{10\} [0-9]\+ [^ ]\+ [^ ]\+ //' file
it relies even more heavily on the exact format of your ls
output, so it is technically even worse than the first version....but it should work for your particular file.
see Why *not* parse `ls`? for info on why parsing ls is bad.
If not all files are owned by emma
, you might want to use an awk script like this instead.
awk 'NF>2 {print $5,$6,$7,$8,$9} ; NF<3 {print}' file
For lines with more than 2 fields, it prints only fields 5-9. for lines with <3 fields, it prints the entire line.
unfortunately, this loses the right-alignment of the size field....that can be fixed with a slightly more complicated awk
script:
awk 'NF>2 {printf "%5s %s %s %s %s\n", $5, $6, $7, $8, $9} ; NF<3 {print}' file
This final version merges the for loop from jasonwryan's answer, so copes with filenames that have any number of single spaces in them (but not consecutive spaces, as mentioned by G-Man):
awk 'NF>2 {printf "%5s", $5; for(i=6;i<=NF;i++){printf " %s", $i}; printf "\n"} ; NF<3 {print}' file
Using Awk:
awk '{if ($1 ~/^-|d/) {for(i=5;i<=NF;i++){printf "%s ", $i}; printf "\n"} else print $0}' file
If the first field begins with -
or d
; then print from the fifth to final field, otherwise print the entire record.