【问题标题】:Cygwin bash: read file word by wordCygwin bash:逐字读取文件
【发布时间】:2012-11-26 06:42:07
【问题描述】:

我想逐字阅读文本文件。问题:有些词包含“/*”。这样的词导致脚本返回根目录中的文件。我试过了:

for word in $(< file)
do
    printf "[%s]\n" "$word"
done

还有其他几种与 echo/cat/etc 的组合... 对于这个文件:

/* example file

我得到以下输出:

[/bin]
[/cygdrive]
[/Cygwin.bat]
...
[example]
[file]

应该很容易,但它让我发疯了。

【问题讨论】:

    标签: linux bash shell unix cygwin


    【解决方案1】:

    您需要关闭路径名扩展通配。使用bash -f 运行一个新的shell,然后重试。请参阅http://wiki.bash-hackers.org/syntax/expansion/globs 或使用man bash 进入手册页,也许可以使用man bash | col -b &gt;bash.txt

    【讨论】:

      【解决方案2】:

      这个解决方案怎么样,$(&lt; file) 周围的双引号阻止 * 被扩展,sed 用于根据需要格式化输出:

      for word in "$(< file)" 
      do
          echo "$word" | sed -E 's/(\S*)(\s)/[\1]\2\n/g'
      done
      

      输出:

      [/*] 
      [example] 
      [file]
      

      【讨论】:

        【解决方案3】:

        这可能会有所帮助;

        # skip blank lines and comment lines begining with hash (#)
        
        cat $CONFIG_FILE | while read LINE
          do
          first_char=`echo $LINE | cut -c1-1`
          if [ "${first_char}" = "#" ] 
           then
              echo "Skip line with first_char=  >>${first_char}<<"
           else
             :
             echo "process line:  $LINE"  ;
           fi
        
        done
        

        另一种方法是使用case语句

        【讨论】:

        • 无用的猫斑!
        【解决方案4】:

        这个怎么样?

        while read -a a; do printf '[%s]\n' "${a[@]}"; done < file
        

        输出:

        [/*]
        [example]
        [file]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-01-24
          • 1970-01-01
          • 2013-02-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-25
          相关资源
          最近更新 更多