LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Linux - Newbie (https://www.linuxquestions.org/questions/linux-newbie-8/)
-   -   trying to do task in vi editor (https://www.linuxquestions.org/questions/linux-newbie-8/trying-to-do-task-in-vi-editor-784175/)

sumeet inani 01-23-2010 03:59 AM

trying to do task in vi editor
 
I am using ubuntu 8.04
What i want to do is delete those lines( those which do not contain any character OR just spaces OR start with a digit then whatever follows is irrelevant)

I have tried few things in vi like
:%s/^\d.*//g
But still that empty line remains

i also tried in terminal
$cat file | grep -iv '^0'
Still those lines that begin with number other than 0 are not removed

Disillusionist 01-23-2010 04:12 AM

Code:

cp -p file file.bak
grep -v '^ *$' file.bak|grep -v '^[0-9]' > file

Ensure the new file contains what you wanted before removing file.bak

sumeet inani 01-23-2010 06:27 AM

So the lesson is
(1)For filtering we can pass grep output to another grep.
(2)i had forgotten the metacharacter [0-9] meaning any number from 0 to 9(both included).
(3)-v means output those lines which do not match the pattern.
(4)'^ *$' means those lines that start with space followed by 0 or more space characters till end.
(3)-p option in cp means preserve mode,ownership,timestamp.
You are great Disillusionist.
Am I right ?

Also I was thinking that in vi editor if we replace those lines by BLANK(say) and use
:map k Ndd
because I use arrow key for navigation not hjkl.
I tried 50k after running command /BLANK and cursor located at end of file.
but it did not delete 50 BLANK lines just one that was 50th above.

Disillusionist 01-23-2010 08:02 PM

Quote:

Originally Posted by sumeet inani (Post 3837559)
So the lesson is
(4)'^ *$' means those lines that start with space followed by 0 or more space characters till end.
Am I right ?

Not quite:

'^' matches the start of the line
' *' matches any number of space characters (including zero)
'$' matches the end of the line

Therefore '^ *$' matches either a blank line, or a line containing nothing but space characters.

sumeet inani 01-24-2010 12:36 AM

I get it.
So I think ^ and $ just means start & end of line.We should NOT combine ^ with space and infer that line has to start with space.

I have also noticed that say if we want line to begin & end with 'a' while anything can occur in between then
/^a.*a$
here . means any character & * causes any character to occur zero or multiple times.so line 'aa' will also match.

I also came to know \_ allows multiple lines.
But I don't understand it fully ?

Also what do you suggest about the thing I tried in vi mentioned in my second post ?

catkin 01-24-2010 01:20 AM

Quote:

Originally Posted by sumeet inani (Post 3838315)
Also what do you suggest about the thing I tried in vi mentioned in my second post ?

Ndd is two commands, N and dd. N means search backwards for the last specified search string. In the test you describe there probably was no "last specified search string" so the N had no effect. The command to delete 50 lines is 50dd.
I don't know the command to delete 50 lines matching a search string (there almost certainly is one -- vi is very powerful); 50ndd would search forwards 50 times and then delete the current line.

sumeet inani 01-24-2010 02:33 AM

As I have done /BLANK then mapping then went to end of file then 50k.
You are right I think 50Ndd evaluates to search 50 times backward then delete that BLANK.
There should be way to enclose Ndd in brackets so that 50 times the whole sequence of two commands would get executed.
Somebody who knows more about vi editor can solve this query also I don't understand \_ in search fully.

jschiwal 01-24-2010 02:40 AM

You can use
:g/^$/d
to delete all blank lines in the file using vim.

To include lines consisting of spaces and/or tabs:
:g/^[ ^I]*$/d
or
:g/^[[:space:]]*$/d

In vim or the shell you can enter TAB by pressing CTL-V TAB. In vim you can also simply hit the TAB key.

sumeet inani 01-24-2010 03:27 AM

To jschiwal
it also worked well in vi.
BUT
if a line contains just a tab then
g/^[[:space:]]*$/d deletes it but not g/^[ ^I]*$/d

I think the command is
:g/PatternToDelete/d
can you point me to more info about this g command ?

i also found out that
[:alnum:] Match all letters and digits.
[:blank:] Match the space and tab characters.
[:digit:] Match digits.
[:lower:] Match lowercase letters.
[:return:] Matches the end-of-line
[:space:] Match all whitespace characters.
[:tab:] Match the tab character
[:upper:] Match the uppercase letters.
i think we have to use these inside character classes ?

jschiwal 01-24-2010 04:47 AM

The character inside "[ ^I]" is an eye (I) and not an ell (l). A control-I to be exact. Don't enter ^ & I separately,
Entering ctrl-v TAB may depend on using bash.

sumeet inani 01-24-2010 06:27 AM

I got it we have to press ctrl+i.
One thing I have noted that /^[:space:]*$ is better than /^[^I]* because latter does not match with line containing just spaces.

chrism01 01-24-2010 05:28 PM

For advanced repetitions, look in the vim manual for macros : http://vimdoc.sourceforge.net/htmldoc/usr_10.html#10.1

sumeet inani 01-24-2010 11:04 PM

This link was very useful http://vimdoc.sourceforge.net/htmldoc/usr_10.html#10.1
For benefit of all users.Let me reiterate
If you want to perform an action multiple times then record a macro
q<register>
register can be a to z in which macro will be recorded.
Whatever you want to do multiple times.Do it once.
q
This will stop recording
Now you can execute that macro multiple times
<count>@<register>
Thank You.

sumeet inani 01-24-2010 11:08 PM

QuestionOne thing remains.That is I want to understand usage of \_ in searching in vi.

chrism01 01-24-2010 11:28 PM

Never seen that (\_), I basically use these methods: http://www.felixgers.de/teaching/ema...h_replace.html


All times are GMT -5. The time now is 08:46 PM.