2013-05-28 58 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

相关问题