2013-05-28 60 views
0

我有一個文件,每行包含由空格分隔的兩個絕對路徑文件名。 我只是想將它們中的每一個都放入一個不同的變量中,以便將第二個複製到第一個變量上。 我試過用sed + regex和變量替換,沒反應。逐行讀取一個文件並每次將兩個字符串存儲到兩個不同的變量中

sed -e 's/(.*)\s(.*)/$2 $1/g' filename 

爲了使用再/斌/ CP $行,然後爲每個讀取線...

接下來我搜索這裏,而在bash,但沒有循環似乎正常,只是工作。 在Perl中它會很容易,但在這種情況下我不能使用它。 我必須從bash腳本中執行它...

任何好主意?

感謝

回答

0

在SED,你必須反斜線括號給他們的特殊意義。此外,拍攝組由\1,不$1引用:

sed -e 's/\(.*\)\s\(.*\)/\2 \1/g' filename 

我不知道需要的/g,但你沒有提供的樣本數據,所以我們不能告訴。它可能不會做你希望的線有兩個以上的路徑爲*是貪婪:

a b c d e -> e a b c d 
+0

你是正確的/ g是沒有必要的,因爲我在每行只有一個空格,因此只出現一次....... .............然而輸入保持不變................文件由2行組成:1:file1 file2和2:file3 file4 --- jannis – user2355173

+0

@ user2355173:正如給出的那樣,該命令不會更改文件。它將新內容打印到標準輸出。要更改文件,必須指定'-i〜'(如果您的'sed'支持),或者通過'> newfile'將輸出重定向到一個新文件。 – choroba

+0

這工作:sed -e's/\(。* \)\ s \(file2 \)/ \ 2 \ 1 /'libs.txt .......這也適用:..... sed -e's/\(。* \)\ s \(file。\)/ \ 2 \ 1 /'libs.txt ........這也是:.......這不是: ..... sed -e's/\(。* \)\ s \(f。+ \)/ \ 2 \ 1 /'libs.txt – user2355173

3

這應該做的伎倆:

while IFS= read -r file1 file2; do 
    cp $file2 $file1 
done < file 
+0

哇,我甚至沒有現在可以做到這一點。好一個! – Noctua

+0

非常感謝@Jaypal,但它也不工作: libs ='cat libs.txt' echo「$ libs」 echo LOOP: while IFS = read -r file1 file2; do cp i $ file2 $ file1 echo file2 = $ file2 file1 = $ file1 done <「$ libs」。 。 。 ./swap_strings.sh file1 file2 file3 file4 LOOP: ./swap_strings。SH:9號線:文件1文件2 :沒有這樣的文件或目錄 貓文件1 文件1 貓文件3 文件3 – user2355173

+0

遺憾的格式!我不明白怎麼做正確....對於名稱混淆抱歉: - ):.....很多感謝@fedorqui,但它也不工作: libs ='cat libs.txt' echo「$ libs」 echo LOOP: while IFS = read -r file1 file2; do cp i $ file2 $ file1 echo file2 = $ file2 file1 = $ file1 done <「$ libs」。 。 。 ./swap_strings.sh 文件1文件2 文件3文件4 LOOP: ./swap_strings.sh:9號線:文件1文件2 :沒有這樣的文件或目錄 貓文件1 文件1 貓文件3 文件3 ..... .............. – user2355173

0

您可以使用以下循環:

while read line; do 
    first = ${line%% ?*} 
    second = ${line##?* } 
    cp $first $second 
done < filename 

其中filename是要分割的文件。

+0

感謝@noctua,不幸的是, .....它說:.....第11行:file1 file2:沒有這樣的文件或目錄...... line11是:done <「$ filename」......非常大! ---- jannis --- – user2355173

+0

用'libs = libs.txt'替換'libs = cat libs.txt'。 – Noctua

+0

已解決:問題在於,讀取的文件在每行的結尾處包含一個\ r \ n,這些行通過使用:myline ='echo -n $ line | tr -d「\ r」'讀完每行後。我只是用你的建議試了一下,但我相信它也可以和其他任何人一起工作。非常感謝大家的幫助... – user2355173

0

如果你可以使用awk,這很簡單:

awk '{print $2 " " $1}' sample > sample2 
+0

你不需要在中間的空引號。使用','應該就夠了。 –

+0

@asclepix,非常感謝,但是這樣我只打印出每個2個字符串的2行文件的第一個字符串......很奇怪! :-( – user2355173

相關問題