Please follow along with these examples:
But you can still glob and expand variables inside quotes, such as:
Globbing (aka pathname expansion) never occurs within any quotes (single or double).
In that case, the string "*two*.txt" in the for loop is not expanded. The loop will always execute one time. That one time, the value of $i will be the literal string "*two*.txt". However, when the ls command is executed, the value of i is expanded to "*two*.txt" and then, at that time, since it is unquoted, that's where the globbing occurs (in short, file globbing will occur after variable expansion, if the variable expansion is unquoted).
Since globbing never occurs within quotes, that's why you notice that it never happens when you quote both the for's list and the variable in the loop.
Quote:
Originally Posted by drewk
Finally, if you do not quote certain forms, you will get unexpected results entirely, such as with a regex:
That's correct, but let's be clear about where the field splitting is occuring. What is being split is the unquoted expansion of $i when the ls command is run. Pathname expansion, when it occurs, happens after field splitting (it actually happens after everything, except quote removal).
Quote:
Originally Posted by drewk
In this particular instance, those two loops give the same result, but they are not interchangeable. Two very different things are happening. In the first instance, ls is called once, with three arguments. In the second, it is called three times, with one argument each time.
In the first, "[[:digit:]]*" is quoted, so no globbing occurs when the for loop's list is evaluated. The for loop will only execute once. After $i is expanded, the resulting "[[:digit:]]*" will not be split into fields since it does not contain any IFS characters (by default, space, tab, and newline). And then, finally, pathname expansion will occur and correctly deal with the whitespace that those filenames contain, because the globbing occurs after the field splitting step. But, remember, since the for loop list is quoted, it can only ever result in one word and the loop will only execute once (not much point in having a loop, in that case ... just write: ls [[:digit:]]*).
In the second version, since the for loop's list is not quoted, [[:digit:]]* will expand to all the filenames that match the pattern and the loop will execute once per filename. So, obviously, these two forms are not equivalent. Depending on what you are doing, you may need access to each individual filename, which is not possible with the first version.
Example that makes it clear (1 iteration versus 3):
Quote:
Originally Posted by drewk
So long story short:
1) Globs [*?] glob inside double or single quotes at the shell to expand file names,
2) Variable expansion happens inside double quotes but not single quotes.
Thank you very much for all of the information!!!! That's awesome! I tried pseudocoder's first script that was deleted and it seems to have worked as far as I could tell. But the warning by Alister made me a bit paranoid. And everything after that is a bit over my head. I wasnt' sure just how to adapt this part:
I would definitely like to know exactly how this works. I'm trying to understand the problem that arises with 'IFS characters' and how to control/manipulate text in files. How can this script be set up to perform what I need to happen? Thanks again.
I think drewk's solution should fit your needs. Assuming that the files you want to process all have the extension .c, and that your html header file (everything up to textarea) is h.html, and that your html footer file (everything after textarea) is f.html:
Hello Unix gurus,
I have a large number of files (say X) each containing two columns of data and the same number of rows.
I would like to combine these files to create a unique merged file containing X columns corresponding to the second column of each file (with a bonus of having the first... (3 Replies)
Hello Everyone,
I have 4 different files (one column in each) that I'm trying to combine into 1 file with four columns. Having issues trying to get the columns to format properly. I have tried the following:
paste file1 file2 file3 file4 | column -s $'\t' -t > results.txt
paste file1 file2... (1 Reply)
Hi
I have a file with 100 million rows. I want to split them into 1000 subfiles and name them from 1.xls to 1000.xls.. Can I do it in awk?
Thanks, (8 Replies)
I have 2 files.
each having 3 coloums
1st field date as 20130322
2nd field time as 05:55
3rd field numberic value
File 2 has entries missing for some date time.
FILE1
20130322 05:35 2219
20130322 05:40 1809
20130322 05:45 1617
20130322 05:50 ... (2 Replies)
Hello All,
I have several column files like this
$cat a_b_s1.xls
1wert
2tg
3asd
4asdf
5asdf
$cat c_d_s2.xls
1wert
2tg
3asd
4asdf
5asdf
desired put put
$cat combined.txt
s1 s2 (2 Replies)
I'm trying to combine colums from multiple file to a single file but having some issues, appreciate your help.
The filenames are the same except for the extension,
path1.m0
---------
a b c
d e f
g h i
path1.m1
---------
m n o
p q r
s t u
File names are path1.m
The... (3 Replies)
Situation:
Our system currently executes a job (COBOL Program) that generates an interface file to be sent to one of our vendors. Because this system processes information for over 100,000 employees/retirees (and growing), we'd like to multi-thread the job into processing-groups in order to... (4 Replies)
All,
I want to combine multiple files in one file.
Something like what we do on the commad line as follows ->
cat file1 file2 file3 > Main_File.
Can something like this be done in a perl script very efficiently?
Thanks,
Rahul. (1 Reply)
I have a good script to rename multiple files, but what's the best way I can remove some text from multiple filenames? Say I have a directory with 35 files with a .XLS at the end, how can I rename them to remove the .XLS but keep everything the same, without having to mv manually. Thanks. (6 Replies)