regex 使用bash将连字符替换为空格

6za6bjd0  于 2022-12-24  发布在  其他
关注(0)|答案(4)|浏览(100)

我正在阅读包含以下数据的文件名:

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
cl25kdpy

cl25kdpy1#

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

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

kxe2p93d2#

您不需要显式计数器或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"
a5g8bdjr

a5g8bdjr3#

我们可以使用bash的字符串替换

#!/bin/bash

input="2017-03-23
2018-01-23
2017-07-31"

output="${input//-/ }"
echo "$output"

产出

2017 03 23
2018 01 23
2017 07 31
woobm2wo

woobm2wo4#

不如这样:

tr '-' ' ' < filename > output

如果你想使用sed,你也可以使用它。你的sed命令不起作用的原因是你需要转义你的括号。试试这个:

sed 's/\([0-9]\)-\([0-9]\)/\1\2/g' $date

相关问题