【问题标题】:reading a file line by line and store the two strings each time into two different variables逐行读取文件并将两个字符串每次存储到两个不同的变量中
【发布时间】:2013-05-28 15:45:54
【问题描述】:

我有一个文件,每行包含两个用空格分隔的绝对路径文件名。 我只想将它们中的每一个放入一个不同的变量中,以便将第二个变量复制到第一个变量中。 我用 sed + regex 和变量替换试过了,没有反应。

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

为了使用 then /bin/cp $line then for each read line...

接下来我在这里搜索了 bash 中的 while 循环,但似乎没有一个能正常且简单地工作。 在 perl 中它会很容易,但在这种情况下我不能使用它。 我必须从 bash 脚本中完成...

有什么好主意吗?

谢谢

【问题讨论】:

    标签: bash


    【解决方案1】:

    这应该可以解决问题:

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

    【讨论】:

    • 哇,我什至现在你都做不到。不错!
    • 非常感谢@Jaypal,但它也不起作用: libs=cat libs.txt echo "$libs" echo LOOP: while IFS= read -r file1 file2;做 cp i$file2 $file1 echo file2=$file2 file1=$file1 done
    • 对不起格式!我不明白如何正确地做......对不起名称混淆:-):......非常感谢@fedorqui,但它也不起作用:libs=cat libs.txt echo "$libs"回声循环:而 IFS= 读取 -r 文件 1 文件 2;做 cp i$file2 $file1 echo file2=$file2 file1=$file1 done
    • 仅将 libs = cat libs.txt 替换为 libs = libs.txt
    【解决方案2】:

    您可以使用以下循环:

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

    filename 是您要拆分的文件。

    【讨论】:

    • 谢谢@noctua,不幸的是也没有成功,.....它说:.....第11行:file1 file2:没有这样的文件或目录......第11行是:完成
    • libs = cat libs.txt 替换为libs = libs.txt
    • 已解决:问题是读取的文件在每一行的末尾都包含一个 \r\n ,我在读取每一行后使用:myline=echo -n $line | tr -d "\r" 删除了它。我刚刚尝试过您的建议,但我相信它也适用于其他任何建议。非常感谢大家的帮助...
    【解决方案3】:

    在 sed 中,您必须对括号进行反斜杠以赋予它们特殊的含义。此外,捕获的组由\1 引用,而不是$1

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

    我不确定是否需要 /g,但您没有提供示例数据,因此我们无法确定。由于* 是贪婪的,它可能不会为具有两个以上路径的行做你想要的:

    a b c d e -> e a b c d
    

    【讨论】:

    • 你是对的, /g 不是必需的,因为我在每一行中只有一个空格,因此只有一次出现...... ..尽管如此输入保持不变......该文件由两行组成:1:file1 file2和2:file3 file4 --- jannis
    • @user2355173:如给定的,该命令不会更改文件。它将新内容打印到标准输出。要更改文件,如果您的sed 支持,您必须指定-i~,或通过&gt; newfile 将输出重定向到新文件。
    • 这行得通: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
    【解决方案4】:

    如果你可以使用awk,那很简单:

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

    【讨论】:

    • 中间不需要空引号。使用, 就足够了。
    • @asclepix,也非常感谢,但是这样我只打印了 2 行文件的第一个字符串,每 2 个字符串......很奇怪! :-(
    猜你喜欢
    • 2018-02-07
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 1970-01-01
    相关资源
    最近更新 更多