【问题标题】:Remove characters from every line of a file in shell从shell中的文件的每一行中删除字符
【发布时间】:2019-10-21 09:18:38
【问题描述】:

我有一个 shell 脚本,它逐行读取变量的值。我需要从每一行中删除某些字符。

我所拥有的—— $sample_variable -

Data 0 start; 1 ABCD0;2 EFGH0;3 IJKL0;4 MNOP0;5 QRST0;6 end;

我想要什么 -

start
ABCD0
EFGH0
IJKL0
MNOP0
QRST0
end

我写的代码 -

IFS=$';' 
for j in $sample_variable
do  
    j=$j | cut -d ' ' -f3-
    echo $j
    j=${j// /''}
    echo $j
    echo $j >> output.txt
done

我正在将输出写入 txt 文件。但是,该文件正在写入 output.txt -

start
1ABCD0
2EFGH0
3IJKL0
4MNOP0
5QRST0
6end

如何删除开头出现的数字?

【问题讨论】:

  • 请写出您的预期输出。
  • 请对输入和输出文件也使用代码块格式。您发布的代码无效,它不应生成任何输出。 for j in $sample_variable 将输入拆分为空格,j=$j | cut -d ' ' -f3- 只是设置j=$j,它不输出任何内容,并执行从标准输入读取的cut。可能您打算使用$( ... ) 命令替换。 the file is getting written - 文件是怎么写成这样的? sample_variable的内容是什么?
  • @KamilCuk 请看一看。我在帖子中做了一些更改

标签: shell file ksh


【解决方案1】:

sed 也很方便,

sample_data="Data 0 start 1 ABCD0;2 EFGH0;3 IJKL0;4 MNOP0;5 QRST0;6 end"
sed -e 's/^[^0]*0\ //' -e 's/;/\n/g' -e 's/\(^[^0-9][^0-9]*\ \)/\1\n/' -e 's/\ //g'

使用/输出示例

$ sample_data="Data 0 start 1 ABCD0;2 EFGH0;3 IJKL0;4 MNOP0;5 QRST0;6 end"
> echo "$sample_data" |
> sed -e 's/^[^0]*0\ //' -e 's/;/\n/g' -e 's/\(^[^0-9][^0-9]*\ \)/\1\n/' -e 's/\ //g'
start
1ABCD0
2EFGH0
3IJKL0
4MNOP0
5QRST0
6end

【讨论】:

    【解决方案2】:

    如果您尝试删除所有数字,我会说您可以尝试使用tr 工具,如下所示:

    IFS=$';' for j in $sample_variable do j=$j | cut -d ' ' -f3- echo $j j=${j// /''} echo $j | tr -d [:digit:] echo $j | tr -d [:digit:] >> output.txt done

    但是,如果您只想删除初始数字,则需要一个更通用的工具,例如 sed,它看起来像:

    IFS=$';' for j in $sample_variable do j=$j | cut -d ' ' -f3- echo $j j=${j// /''} echo $j | sed -e 's/^[0-9]\?//' echo $j | sed -e 's/^[0-9]\?//' >> output.txt done

    【讨论】:

    • 它正在做我想做的事。我已经编辑了我的问题。你能检查一下吗?数据中也有我想要的数字。
    • @TeeKay,如果您只想删除行中第一个字符的数字,您可能需要使用sed 而不是tr。如果是这样的话,我可以试着做点什么。
    • 我能够使用您给出的答案进行鞭打。将发布我的答案。感谢您的帮助:)
    【解决方案3】:

    下面的代码解决了问题——

    i=0
    IFS=$';' 
    for j in $sample_variable
    do 
        j=${j// /''}
        j=$(echo "$j" | tr -d [$i] | tr -d ["\n"])
        echo "$j" >> output.txt
        i=$((i+1))
    done
    }
    

    所以,我采用了一个变量“i”,它将在循环中不断迭代。使用该变量,我可以删除仅出现在每行开头的数字。

    【讨论】:

      【解决方案4】:

      您还需要删除空格前面的所有内容:

      j=${j//* /''}
      

      '' 已取消。

      j=${j//* /}
      

      * 匹配任意数量的任意字符。因此,如果j 有两个空格,那么它将删除前面的所有内容,包括第二个空格。根据您的需要,使用它可能会更好:

      j=${j##* }
      

      j=${j#* }
      

      shell parameter expansion in bash

      读取数组中的变量然后处理可能会更好:

      sample_variable='1 ABCD;2 EFGH;3 IJKL;4 MNOP;5 QRST;'
      IFS=';' read -r -a arr <<<"$sample_variable"
      

      然后您可以忽略第一个空格前面的任何内容来拆分变量:

      for j in "${arr[@]}"; do
           j=${j//* /}
           echo "$j"
      done
      

      但我会执行以下操作,但它会留下一个空的尾随换行符,因此可能需要 sed '$d' - 删除最后一行:

      <<<"$sample_variable" tr ';' '\n' | cut -d' ' -f2- | sed '$d'
      

      注意事项:

      • j=$j | cut -d ' ' -f3- 没有做你认为的事情。它执行j=$j,将变量设置为自身。然后它在没有输入的情况下执行cut -d ' ' -f3-,因为赋值不会打印任何输出。
      • 请记住始终引用您的变量扩展。

      【讨论】:

      • &lt;&lt;&lt;"$sample_variable",我不认为 ksh 有 herestrings
      猜你喜欢
      • 2018-11-09
      • 2015-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-16
      相关资源
      最近更新 更多