使用bash用空格替换连字符

时间:2018-04-29 00:23:07

标签: regex bash sed

我正在读取包含此数据的文件名:

2017-03-23
2018-01-23
2017-07-31

我想读取每一行并用空格替换连字符。鉴于上面的例子,我应该得到以下结果:

2017 03 23
2018 01 23
2017 07 31

这是我的代码:

#!/bin/sh

filename=extract_dates.dat
line=1
totline=`wc -l < $filename`

while [ $line -le $totline ]
do
    date=`sed -n -e ''"$line"'p' $filename | awk '{print $line}'`
    echo $date
    test=`sed 's/([0-9])-([0-9])/\1\2/g' $date`
    echo $test
    line=`expr $line + 1`
done

我收到以下错误:

sed: 1: "s/([0-9])-([0-9])/\1\2/g": \1 not defined in the RE

3 个答案:

答案 0 :(得分:1)

您不需要明确的计数器或sedawk; bash本身可以解决这个问题。 (你使用awk,尤其不会做任何事情。)

filename=extract_dates.dat

while IFS=- read -r year month day; do
    echo "Year: $year"
    echo "Month: $month"
    echo "Day: $day"
done < "$filename"

答案 1 :(得分:1)

tr将用空格替换连字符,例如:

test=$(echo $date | tr "-" " ")

答案 2 :(得分:0)

这个怎么样:

import UIKit
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true

let documents = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!

if let url = URL(string: "https://i.stack.imgur.com/xnZXF.jpg") {
    URLSession.shared.downloadTask(with: url) { location, response, error in
        guard let location = location else {
            print("download error:", error ?? "")
            return
        }
        // move the downloaded file from the temporary location url to your app documents directory
        do {
            try FileManager.default.moveItem(at: location, to: documents.appendingPathComponent(response?.suggestedFilename ?? url.lastPathComponent))
        } catch {
            print(error)
        }
    }.resume()
}

如果您想使用tr '-' ' ' < filename > output ,也可以使用它。你的sed命令不起作用的原因是你需要逃避你的副手。试试这个:

sed