Bash脚本 - Bash脚本 - 从文件编辑文本行

时间:2015-01-15 17:24:09

标签: linux bash shell

我使用bash脚本从文本文件中读取数据。

数据:

04:31 Alex M.O.R.P.H. & Natalie Gioia - My Heaven http://goo.gl/rMOa2q 
[ARMADA MUSIC]

07:46 Fabio XB & Liuck feat. Christina Novelli - Back To You (Wach Remix)http://goo.gl  /yGxqRX 
[DIGITAL SOCIETY RECORDINGS]

代码:

#!/bin/bash


file="/home/nexusfactor/Desktop/inputData(linux).txt"
while IFS= read -r line
do
       # display $line or do somthing with $line
       echo "$line"
done <"$file"

我想删除两首歌曲之间的空白区域,然后删除歌曲开头的时间和文件末尾的超链接/工作室名称。所以我的输出是:

Alex M.O.R.P.H. & Natalie Gioia - My Heaven
Fabio XB & Liuck feat. Christina Novelli

2 个答案:

答案 0 :(得分:3)

echo " 04:31 Alex M.O.R.P.H. & Natalie Gioia - My Heaven http://goo.gl/rMOa2q [ARMADA MUSIC]

07:46 Fabio XB & Liuck feat. Christina Novelli - Back To You (Wach Remix) http://goo.gl/yGxqRX [DIGITAL SOCIETY RECORDINGS]" \
| sed '/^[ \t]*$/d;s/^[0-9][0-9]:[0-9][0-9] //;s/http:.*//'

<强>输出

Alex M.O.R.P.H. & Natalie Gioia - My Heaven
Fabio XB & Liuck feat. Christina Novelli - Back To You (Wach Remix)
# ---------------------------------------^----- ???? 

不完全是您的示例输出显示的内容,但符合您的书面要求 删除歌曲开头的时间和结尾的超链接/工作室名称...

使用sed的内置功能读取文件的每一行并处理它,而不是读取while循环中的每一行。你可以做到

sed '/^[ \t]*$/d;s/^[0-9][0-9]:[0-9][0-9] //;s/http:.*//' file > newFile && /bin/mv newFile file

或者,如果您使用的是现代Linux环境(和其他人),请使用-i选项覆盖现有文件:

sed -i '/^[ \t]*$/d;s/^[0-9][0-9]:[0-9][0-9] //;s/http:.*//' file

IHTH

答案 1 :(得分:2)

#!/bin/bash

file="/home/nexusfactor/Desktop/inputData(linux).txt"
while read -r date line
do
  [[ $date == "" ]] && continue    # empty line -> next loop
  [[ $date =~ ^\[ ]] && continue   # line starts with "[" -> next loop
  line="${line%(*}"                # remove "(" and everything to the right of it
  line="${line%http*}"             # remove "http" and everything to the right of it
  echo "$line"
done <"$file"

输出:

Alex M.O.R.P.H. & Natalie Gioia - My Heaven 
Fabio XB & Liuck feat. Christina Novelli - Back To You