【问题标题】:Line Break in C# String [duplicate]C#字符串中的换行符[重复]
【发布时间】:2020-02-14 18:07:35
【问题描述】:

我在以下 C# 字符串中收到一个随机换行符,无法确定输出为何位于两个单独的行上。

我实际上只是尝试以两种不同的方式定义变量。两者产生相同的结果。

string cmdStr = "docker images | grep -E '^prabhasgupte/webmon.*latest' | head -1 | awk '{print $3}'";
Console.Write(cmdStr);
string imageId = commands.Bash(cmdStr);
Console.Write(imageId);
string x = $"docker tag {imageId} scan_target:{imageId}";
Console.Write(x);

这是我收到的输出:

码头工人图片 | grep -E '^prabhasgupte/webmon.*latest' |头-1 | awk '{打印 $3}'

0043699b906f

码头标签 0043699b906f

scan_target:0043699b906f

public static string Bash(this string cmd)
{
    var escapedArgs = cmd.Replace("\"", "\\\"");

    var process = new Process()
    {
        StartInfo = new ProcessStartInfo
        {
            FileName = "/bin/bash",
            Arguments = $"-c \"{escapedArgs}\"",
            RedirectStandardOutput = true,
            UseShellExecute = false,
            CreateNoWindow = true,
        }
    };
    process.Start();
    string result = process.StandardOutput.ReadToEnd();
    process.WaitForExit();
    return result;
}

【问题讨论】:

  • 您是否为此附加了调试器?两个字符串之一是否可以包含无关的换行符?
  • 你可能想仔细看看 Bash() 的实现
  • commands.Bash(...) 返回的字符串包含换行符。
  • 我是not able 在用固定字符串替换commands.Bash() 调用时重现。我想它与该实现有关。查看调试器返回什么
  • string imageId = commands.Bash(cmdStr) + " some test";,试试这个并运行它......它是否将some test分开?或者试试这个Regex.Replace(commands.Bash(cmdStr), @"\t|\n|\r", "");

标签: c# string .net-core


【解决方案1】:

似乎您的问题可能是 awk 插入换行符,这是它的默认行为。我从awk-related SO question 复制了这个:

AWK 中的 ORS(输出记录分隔符)变量默认为“\n”,并在每一行之后打印。如果您希望连续打印所有内容,可以在 BEGIN 部​​分将其更改为“”。

【讨论】:

    【解决方案2】:

    发生这种情况的原因是imageId 在 bash 命令中有一个换行符。尝试修剪结果

       string imageId = commands.Bash(cmdStr).TrimEnd( '\r', '\n', Environment.NewLine.ToCharArray() );
    

    【讨论】:

    • 当然,换行符来自 bash 命令是正确的,但是当您可以在问题真正源自 (awk) 的地方解决问题时,为什么还要在 C# 中使用创可贴呢?
    • @DanielCrha 我相信你可以在调用脚本时将cat 作为命令行参数传递,这实际上可能会删除它,我自己没有尝试过,但会很有趣。
    • @Çöđěxěŕ cat 的意思是“流管道”(通常它覆盖文件)所以是的,它确实“泵送”了 bash 中的输出。我很确定它不会插入新行字符,因为 grep 它的结果相当常见 - 顺便说一下,我不同意它是 重复相同问题,因为你标记了.. 他在问 为什么 “随机“出现了中断。我(唯一的)告诉他为什么会有“随机中断”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 2012-12-22
    相关资源
    最近更新 更多