Bash如何在文件中获取文本

时间:2013-03-02 15:12:45

标签: bash

  1. 我档案/ tmp / txt
  2. 文件内容:aaa aaa aaa _bbb bbb bbb
  3. 我需要保存文件/ tmp / txt_left: aaa aaa aaa
  4. 我需要保存文件/ tmp / txt_right: bbb bbb bbb
  5. !!!注意力寻求解决方案而不使用变量 !!!

4 个答案:

答案 0 :(得分:2)

awk -F '_'  '{print $1> "/tmp/txt_left"; print $2 > "/tmp/txt_right" }' /tmp/txt

答案 1 :(得分:1)

您可以尝试剪切线条,在下划线上切开

Cat /tmp/txt | cut -d_ -f 1 > txt_left

答案 2 :(得分:1)

一种方式:

更短更快:

sed -ne $'h;s/_.*$//;w /tmp/txt_left\n;g;s/^.*_//;w /tmp/txt_right' /tmp/txt

解释:可写:

sed -ne '
    h;        # hold (copy current line in hold space)
    s/_.*$//; # replace from _ to end of line by nothing
    w /tmp/txt_left
              # Write current line to file
              # (filename have to be terminated by a newline)
    g;        # get (copy hold space to current line buffer)
    s/^.*_//; # replace from begin of line to _ by nothing
    w /tmp/txt_right
              # write
 ' /tmp/txt

Bash为

这不是一个真正的变量,我使用第一个参数元素来完成工作并在完成后恢复参数列表:

set -- "$(</tmp/txt)" "$@"
echo >>/tmp/txt_right ${1#*_}
echo >>/tmp/txt_left ${1%_*}
shift

取消字符串在参数行的第一个位置, 对$1进行操作,而不是shift参数行,所以没有使用变量,并且很好,参数行以原始状态返回

...这是一个bash 解决方案; - )

答案 3 :(得分:0)

使用bash进程替换,tee和cut:

tee -a >(cut -d _ -f 0 > /tmp/txt_left) >(cut -d _ -f 1 >/tmp/txt_right) < /tmp/txt